Newsgroup: it.comp.os.linux.development
Titolo: [C++] Sintassi con g++

E' la prima volta che programmo in C++ sotto linux e leggendo le FAQ ho
visto che un compilatore è g++, che può essere chiamato da linea di
comando. Ho provato quindi a compilare un vecchio programmino windows
che funziona da shell, ma ho ricevuto un casino di errori. Mi sono
accorto che sono tutti riguardanti un tipo particolare di
dichiarazione, mi chiedevo come mai. Io sono solito usare sintassi di
questo genere:
for (int variabile = 0; ecc...)
{
        ...
}
cioè, dichiarare direttamente una variabile all'interno
dell'intestazione del ciclo. Tutte mi vengono segnalate come errori e
mettendo all'esterno la dichiarazione tutto funziona. Come mai non lo
accetta? Con Borland e Visual C++ mi pareva che funzionasse
correttamente.
Grazie.
Luca

 correttamente.
certo che lo supporta. Posta il comando che usi per compilare e gli errori.

 errori.
Allora, il comando che uso è quello che ho trovato sulle FAQ:
g++ cppMain.cpp
e l'errore che mi trovo è:
hEvaluate.h: In function `double FindOperator(char*, int, char, bool)':
hEvaluate.h:624: error: name lookup of `iCounter' changed for new ISO
`for'
   scoping
hEvaluate.h:618: error:   using obsolete binding at `iCounter'
la variabile che dichiaro dentro al for è ovviamente iCounter, che poi
da questi errori.
Grazie mille.
Luca

 da questi errori.
Leggere il messaggio di errore potrebbe essere un inizio :)
Probabilmente alla linea 624 riusi la variabile che usavi nel ciclo, 
questo NON e` piu` C++ standard, e' una cosa che pure i nuovi visual 
studio (7+) non dovrebbero accettare. Questo perche` lo scope di una 
variabile dichiarata nell'intestazione di un ciclo for e' giustamente 
SOLO il ciclo for stesso, quindi se vuoi usare la variabile all'esterno 
del ciclo for devi dichiararla anche all'esterno.
Bye,
  Gabry
PS: Purtroppo questo tipo di sintassi e` particolarmente diffusa nei 
sorgenti di programmi originariamente sviluppati x windows... cosiccome 
il fatto di permettere l'uso di variabili temporanee come parametri by 
reference di funzioni non const (altra cosa non piu' valida).

 all'esterno del ciclo for devi dichiararla anche all'esterno.
Si, immaginavo che il problema fosse questo, ma mi chiedevo il perchè.
L'avevo già corretto, non è un problema, solo che tutti i miei
programmi sono scritto con questo sistema e non è molto comodo andare a
correggere tutto, ci sarane decine e decine di correzioni da fare, mi
chiedevo se esistesse un modo per risolvere diverso. Grazie cmq per le
informazioni.
Luca

 Si, immaginavo che il problema fosse questo, ma mi chiedevo il perchè.
non sono un grande esperto di c++, però può darsi che sia legato
all'aggiornamnto del compilatore all'ansi c++ 99? Se è questo prova a
leggere la manpage di g++, ha dei flag per selezionare la funzionalità 89
o 99.

Ottavio Campana wrote:

Credo anch'io che sia questo, è capitato anche a me. C'è una flag che forza
a non utilizzare il nuovo standard ma non ricordo qual è.
-- 
Simone
Linux Registered User #353303
www.sromano.com
 

 Luca
ciao,
   anche se è uno sbattimento io credo che gli standard vadano seguiti, per
cui apri un buon editor ed inizia a modificare :-) Credo che se si vuole
imparare a programmare occorra usare gli standard, oppure sono io un
sognatore?
saluti affamati,
  nelson
-- 
Definizione di Shaw:
 Essere innamorati significa esagerare smisuratamente
 la differenza tra una persona ed un'altra.

    per
]zac[
Secondo me non è un problema di standard ma di non fare programmazione
potenzialmente scorretta.
Se una variabile esiste solo all'interno di un certo scope è potenzialmente
molto pericoloso usarla all'esterno visto che il compilatore potrebbe
tranquillamente assegnare lo spazio di memoria ad altri usi.
E' un po' come far restituire ad una funzione un puntatore ad una variabile
'locale' di quella funzione.

 [cut].
e secondo te quanto sono distant le due cose? Per me sono la stessa cosa e
mi sa che stiamo dicendo la stessa cosa (spero) ;-)
good day,
   nelson
-- 
"Con la sola imposizione delle mani, posso ungervi la giacca e la
cravatta..."
  -- Mago Oronzo (Raul Cremona), "Mai Dire Gol"

 potenzialmente scorretta.
Mi sa che stai esagerando. Non sapevo di questa cosa, quindi l'avevo
sempre fatta in un certo modo. Ora che so che non è corretta al 100%
eviterò di utilizzarla ovviamente, ma il problema non stava qui, fino a
qui ci arrivo anche io. Adesso è solo una questione pratica, cercavo
solo di evitare di perdere tempo per nulla, solo tempo buttato
modificare decine e decine di casi come questi per nulla. Basta che
funzioni, tutto qui, dopotutto è solo codice che scrivo a scopo
didattico per imparare ed allenarmi, nulla di importante.
Grazie cmq.
Luca

 didattico per imparare ed allenarmi, nulla di importante.
se è codice didattico ok, ma se fossi un professionista con questa
dichiarazione ti saresti ben messo in luce, e non certo per meriti....

 serio.
E mi sa che ti non hai capito quello che intendevo :-)
Intendevo che nella mia situazione stava andando su cose troppo
complicate. Io sto cercando di imparare e queste cose così sottili
tutto sommato non rientrano nei miei interessi adesso. Cmq ho capito il
problema. Non volevo complicarmi così la vita.
Grazie mille.
Luca

 mi sa che stiamo dicendo la stessa cosa (spero) ;-)
]zac[
Rispettare standard like programmi portabili.
Programmazione scorretta like seminare bug.

 solo di evitare di perdere tempo per nulla, solo tempo buttato
]zac[
Purtroppo (purtoppo per te), ti sbagli (naturalmente libero di programmare a
tuo insindacabile piacere).
L'unica cosa che mi infastidisce è che ti dichiari un dilettante, ma
comunque ti senti tanto sicuro da avere giudizi solidi sui punti 'oscuri'
del C (di norma ci vogliono molti mesi perché diventi automatico non cadere
il quelle trappole).
-----------------------
Ribadisco per chi ha voglia di pensarci sopra, non c'è nessuna garanzia che
una variabile dichiarata in una zona locale sia sicura anche fuori dalla
zona locale, anzi, lo standard che dovrebbero seguire tutti compilatori C
dice che è un errore grave (non un warning).

Giuseppe Della Bianca wrote:

buffo, sembrerebbe le due cose non vadano di pari passo. Chiaro che è il
pogrammatore che crea programmi corretti o scorretti, ma se già uno segue
gli standard è sicuro che è sulla retta via.... poi non sempre standard =>
portabile
nelson
-- 
Che vitaccia!  Ci vorrebbe un cacciavite piu' grosso...
  -- Da it.hobby.umorismo

 automatico non cadere il quelle trappole).
No, mi spiace, ma sei tu a non aver capito. Ho detto più volte che ho
capito l'errore, ed anzi lo conoscevo già da prima. L'unica cosa è che
mi pareva esagerato perdere ore per correggere un codice che non ha
nessuna importanza. Mi bastava che partisse. L'errore l'ho capito, ed
ovviamente ora eviterò quella strada. Forse non mi ero spiegato, ma non
mi pare un ragionamento tanto assurdo. Il codice non è corretto secondo
lo standard...amen, andato, non devo continuare a lavorarci.
Scusa se mi sono spiegato male.
Luca