Newsgroup: it.comp.lang.c++
Titolo: Perche' questo programma non viene compilato

#include <iostream>
#define INF -30
#define SUP 100
float fahrenheit;
float conversione(int c);
int main(void)
{
int centigradi;
int incremento=6;
centigradi=INF;
while (centigradi<=SUP)
{
fahrenheit=conversione(centigradi);
cout << form("%10d C %10.2f F\n",centigradi,fahrenheit);
centigradi+=incremento;
}
}
float conversione(int c)
{
float far;
far=9.0/5.0*c+32;
return (far);
}
se provo a compilarlo sotto Linux, scrivendo g++ conv_far.cpp mi da'
l'errore:
conv-far.cpp:14: error: `cout' undeclared (first use this function)
Francesco

 conv-far.cpp:14: error: `cout' undeclared (first use this function)
Il programma ha alcune pecche stilistiche...
ma in particolare non compila in quanto devi usare:
std::cout
oppure usare una direttiva using.
Inoltre probabilmente ti serve un header o un prototipo per form visto
che non e' standard e non fa parte di iostream.
Tommaso
-- 
Posted via Mailgate.ORG Server - 
http://www.Mailgate.ORG

 oppure usare una direttiva using.
Non capisco, In Windows, con DEV-C++ viene compilato correttamente, a
parte il riferimento a form, che ho eliminato
Francesco
-- 
      Teaching OnLine 
Corsi online di programmazione
Php, Asp, C, C++, Visual Basic, Delphi
Linux Shell Programming
------------------------------------
http://www.teachingonline.it

 Francesco
Usare Windows non è una scusa per non seguire lo standard ISO. GCC ha
ragione, quindi bisogna abituarsi a scrivere il namespace standard prima
del nome della classe / funzione contenuta nelle STL.
Vedi paragrafo 17.4.1.1 punto 2 dello standard ISO/IEC FDIS 14882:1998(E).
Anche vecchie versioni del GCC permettevano di omettere la selezione del
namespace std, intendendolo implicito. La serie 3.x ha cambiato questo
comportamento scorretto.
Consiglio di a) non usare mai la direttiva "using" negli header, a meno
che non si sappia perfettamente cosa si sta facendo e b) non usarla
nemmeno nello spazio globale dei file di implementazione, bensì con
scope il corpo di una singola funzione. Esempio:
-----------
// niente "using" qui
void f() {
   // meglio essere più precisi che non "using namespace std;":
   using std::string;
   // corpo della funzione
   string s = "pippo";
}
-----------
Saluti,
-- 
Matteo Settenvini
FSF Associated Member
Email : 
mat...@member.fsf.org
-----BEGIN GEEK CODE BLOCK-----
Version: 3.12
GCS d--(-) s+:- a-- C++ UL+++
P?>++ L+++>$ E+>+++ W+++ N++ o?
w--- O- M++ PS++ PE- Y+>++
PGP+++ t+ 5 X- R tv-- b+++ DI+
D++ G++ e h+ r-- y?
------END GEEK CODE BLOCK------

 contenuta nelle STL.
Hà detto che usava DEV-C++. Mi sembra che è anche g++. La
differenze è forse la versione.
Hà incluso <iostream>. Con V++, <iostream> è sempre in std::;
per non usare std::, bisogna includere <iostream.h>. Con vecchie
versioni de g++, invece, std:: vale :: (e <iostream> vale
<iostream.h>).
Se usa <iostream> (e std::), hà bisogna anche di <ostream>; gli
operatori << non sono definiti in <iostream> (almeno che
<iostream> include <ostream>, che è permesso, mà non obligato).
In più, usava anche una funzionne form, che non essista nella
norma, ma è (o era -- credo che non è più supportata) proprio
un'estensione g++.
Infine, per essere portabile, aveva bisogna di fare :
    #include <iostream>
 +  #include <ostream>
 +  #include <iomanip>
    #define INF -30
    #define SUP 100
    float fahrenheit;
    float conversione(int c);
    int main()
    {
        int centigradi;
        int incremento=6;
        centigradi=INF;
 +      std::cout.setf( std::ios::fixed, std::ios::floatfield ) ;
 +      std::cout.precision( 2 ) ;
        while (centigradi<=SUP)
        {
            fahrenheit=conversione(centigradi);
 +          std::cout << std::setw( 10 ) << centigradi << " C "
 +                  << std::setw( 10 ) << fahrenheit << " F\n" ;
            centigradi+=incremento;
        }
    }
    float conversione(int c)
    {
        float far;
        far=9.0/5.0*c+32;
        return (far);
    }
(Hò indicato le linee dove son cambiamenti.)
--
James Kanze                                           GABI Software
Conseils en informatique orientée objet/
                   Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, 
+33 (0)1 30 23 00 34

Lampa Dario wrote:
[scherzoso ON]
alla domanda circa il titolo, risponderei che il compilatore che 
usi possiede un solido senso estetico, e quindi rifiuta 
categoricamente di compilare in C++ quella roba lì :-)
[scherzoso OFF]
voglio dire, perché usare tre variabili globali che sono usate 1 
volta in un solo posto ? E le variabili locali sono assenti ?
float CnvFahrenait (int);
int main (void)
{
int centigradi = INF, incremento = 6;
while (centigradi <= SUP)
     {
     cout << qualcosa . form ("%10d C %10.2f F\n", \
     centigradi, CnvFahrenait (centigradi));
     centigradi += incremento;
     }
}
float CnvFahrenait (int c)
{
static const float Rap = 9.0 / 5.0;
// eseguito soltanto una volta
return (Rap * c + 32.0);
}
così è un po' più sfrundata e si eliminano calcoli ripetuti 
eliminabili, e qualche variabile piuttosto ridondante


 
E quale sarebbe il vantaggio di riscrivere le funzione Farenheit in tale 
modo? A me sembra solo piu' illegibile.

 del nome della classe / funzione contenuta nelle STL.
DevC++ usa gcc, un port chiamato mingw. Quindi il problema potrebbe
essere la versione di gcc (e quindi probabilmente del devc++ stesso).


 <iostream> include <ostream>, che è permesso, mà non obligato).
Sicuro che non sia obbligato? Se sei sicuro, potresti per favore
riportarmi il pezzo dello standard.
Grazie,


 riportarmi il pezzo dello standard.
James ha ragione:
27.3 Standard iostream objects
Header <iostream> synopsis
namespace std {
extern istream cin;
extern ostream cout;
extern ostream cerr;
extern ostream clog;
extern wistream wcin;
extern wostream wcout;
extern wostream wcerr;
extern wostream wclog;
}
1 The header <iostream> declares objects that associate objects with
the standard C streams provided for by the functions declared in
<cstdio> (27.8.2).
Nota che dice *dichiara*, non *definisce*. E' una discussione che si
ripete periodicamente su comp.lang.c++.moderated .
Ciao,
Nicola

 provare il compilatore g++ di Linux.
¿Y quien es el autor de ese libro?
Saludos,
Nicola

 Nota che dice *dichiara*, non *definisce*.
Grazie. Avevo notato sullo standard la synopsis del header <iostream>, e
che dichiara e non definisce, ma non avevo mai pensato che potesse non
icludere (direttamente o indirettamente) <ostream>.
Questo renderebbe hello world sulla maggior parte di libri anche di
pubblicazione 2005 non conforme allo standard.




L'autore e' Javier Ceballos Sierra, (professor titular de la escuela
Universitaria Politecnica Universidad de Alcala' de Henares (Madrid))
Ole'


 Soviet_Mario
Sulla riduzione dei nomi globali sono perfettamente d'accordo, anche io
nei miei programmi cerco di eliminarli del tutto, quando non ne posso
realmente fare a meno.
