Newsgroup: it.comp.lang.c++
Titolo: Scope in dichiarazione for

Salve a tutti,
	potreste spiegarmi come mai nel compilare questo codice ottengo
il seguente errore?
Cmatrix::Cmatrix(const Cmatrix & c)
{
......
for (int i=0;i<numcol;i++)
{
	beta[i]=c.beta[i];
	.....
}
for (i=0;i<numrow;i++)
{......}
}
[marduk@dreamscape]g++  -g -Wall -I.  -c cmatrix.cpp -o cmatrix.o
cmatrix.cpp: In method `Cmatrix::Cmatrix(const Cmatrix &)':
cmatrix.cpp:55: name lookup of `i' changed for new ANSI `for' scoping
cmatrix.cpp:49:   using obsolete binding at `i'
make: *** [cmatrix.o] Error 1
make: Target `prova' not remade because of errors.
La riga 55 è il secondo for mentre la 49 è il primo.
Di che tratta questo new ANSI 'for' scoping?
Grazie
Paolo

 }
Lo Standard del C++ stabilisce che la variabile dichiarata all'interno
dell'istruzione for (nel tuo caso "int i") sia disponibile fino alla fine
del medesimo blocco for. In pratica il secondo for, quando gli dici "i=0",
non sa di che "i" tu stia parlando, perche' la variabile intera i e' stata
distrutta immediatamente prima.
Ciao
Domenico Barra

 >Cmatrix::Cmatrix(const Cmatrix & c)
 >{
 >......
 >for (int i=0;i<numcol;i++)
 >{
 >       beta[i]=c.beta[i];
 >       .....
 >}
 >for (i=0;i<numrow;i++)
 >{......}
 >}
A norma di standard, la i del primo for ha scope limitato
al solo for, di conseguenza non puoi utilizzare i quando il for e` finito
(a meno di ridichiararla).
In pratica devi scrivere:
Cmatrix::Cmatrix(const Cmatrix & c)
{
......
for (int i=0;i<numcol;i++)
{
         beta[i]=c.beta[i];
         .....
}
for (int i=0;i<numrow;i++)
{......}
}
Paolo
--
Paolo Marotta
Duck Communication Entertainment s.r.l.
Largo Arenula, 11 - Roma
http://www.duckce.com
p.ma...@duckce.com
-- 
Posted from 
HA-server-a.cs.interbusiness.it
 [151.99.250.31] 
via Mailgate.ORG Server - 
http://www.Mailgate.ORG

 make: Target `prova' not remade because of errors.
Lo scope della variabile i è solo all'interno del for e quindi la devi
dichiarare anche nel secondo.
EMG

(a meno di ridichiararla).
Grazie per le risposte, volevo sapere se questa cosa e' stata introdotta
recentemente, ho ripreso la programmazione in C++ dopo tre anni di
obbligato uso di altri linguaggi e mi sembra di ricordare che se
dichiaravo due volte la i in due cicli diversi dava un warning per dirti
che era stata gia' dichiarata. O ricordo male ?
Ciao 
Paolo

che era stata gia' dichiarata. O ricordo male ?
allora siamo in due "reduci". Comunque ricordi male. Tre anni fa non 
esisteva ancora un compilatore (che io sappia) che gestiva correttamente
questo caso. Ma lo standard era gia' chiaro.
-- 
Posted from 
adsl-21-135.38-151.net24.it
 [151.38.135.21] 


che era stata gia' dichiarata. O ricordo male ?
Non so di preciso quando sia stata introdotta( ma presumo dopo il
1992, visto che nel Turbo C++ 3.1 questa regola non era ancora stata
introdotta), fattostà che in tutti i compilatori moderni(a parte il
Visual C++, sul quale evito volontariamente di infierire) il campo di
visibilità di una variabile dichiarata all'interno di un for riguarda
solamente il for.
Ed in ogni caso, per quanto ne so io i vecchi compilatori dovrebbero
restituire un errore, non uno warning.
Lavinia
WINWORD.EXE - ERRORE DI APPLICAZIONE
l'istruzione a "0x3017ff27"ha fatto riferimento alla
memoria a "0x02a3143c".La memoria non poteva essere 'read'.

Certamente BCB 3.0 gestiva lo scope delle variabili dichiarate
nell'inizializzazione di un for in modo corretto, ed e' uscito piu' di
due anni fa.
Ciao,
Nicola