Newsgroup: it.comp.lang.c++
Titolo: Errore strano, molto strano

Ciao a tutti,
ho un errore a mio avviso indecifrabile.
Questo è il codice, molto semplificato:
include<iostream.h>
class Poligoni
{
        public:
                virtual int area(void)=0;
                virtual int perimetro(void)=0;
};
class Quadrato:public Poligoni
{
        public:
                void setLato(int x){lato=x;}
                int area (void){return lato*lato;}
                int perimetro (void){return lato*4;}
        private:
                int lato;
};
class Rettangolo:public Poligoni
{
        public:
                void setLato(int x,int y){lato=x;lato1=y;}
                int area (void){return lato*lato1;}
                int perimetro (void){return (lato*lato1)*2;}
        private:
                int lato,lato1;
};
int main()
{
        Quadrato pippo;
        Rettangolo pluto;
        int n;
        cin>>n;
        switch(n)
        {
        case 1:
                cout<<"\tdammi il valore dei lati"<<endl;
                int lato;
                cin>>lato;
                pippo.setLato(lato);
                int ar=pippo.area();
                cout<<"\til risultato e': "<<ar<<endl;
                int p=pippo.perimetro();
                cout<<"\til risultato e': "<<p<<endl;
        break;
        case 2:                // QUI HO UN'ERRORE: this case bypasses
the inizialializaion of a local variable
                cout<<"\tdammi il valore dei lati"<<endl;
                int lato2,lato3;
                cin>>lato3>>lato2;
                pluto.setLato(lato3,lato2);
                int ar=pluto.area();
                cout<<"\til risultato e': "<<ar<<endl;
                int p=pluto.perimetro();
                cout<<"\til risultato e': "<<p<<endl;
        break;
        }
}
Se inserisco tutto quello che è nel case in un blocco tra due graffe,
viene compilato correttamente.
Questo vuol dire che ogni volta che in un case inizializzo una nuova
variabile devo racchiudere il blocco tra graffe ? Mi sembra strano.
Il compilatore usato è il CC sotto Solaris. E non ho altri compilatori
per poter effettuare la prova.
Qualcuno mi dice come stanno le cose ?
Grazie, Max

 variabile devo racchiudere il blocco tra graffe ? Mi sembra strano.
E invece e' proprio cosi'. Non so cosa dice lo standard al riguardo, ma sia
il borland 5 che vc6 (sotto windows) che gcc (sotto linux) si comportano
nello stesso modo.
Ciao
Alex


Ciao Max,
a parte la svista nel calcolo del perimetro del rettangolo, avresti dovuto
avere errore anche nel primo case dove dichiaravi delle variabili lato, ar e
p.
In effetti in un case non e´ ammesso dichiarare variabili, per cui dovresti
aprire la parentesi { dopo i vari case per chiuderla dopo i break, cosi´
come hai pensato di fare.
Oppure se hai bisogno di una variabile comune per i vari case, la puoi
dichiarare subito dopo la parentesi dello switch.
Maurus


Ma sbaglio o nel C non è così ?

...

Sbagli,
anche nel C e´ cosi´, anzi la´ e´ piu´ severo, visto che le dichiarazioni
delle variabili vanno fatte all´inizio del blocco e non come nel C++ che
puoi dichiarare una variabile anche appena prima di usarla (ma non nel caso
del case dello switch).
Maurus

del case dello switch).
C'e' una cosa in cui il C++ e' piu' severo del C... l'inizializzazione
di una variabile non puo' essere saltata in C++ mentre puo' essere
saltata in C. Ad esempio...
   #include <stdio.h>
   int main(void)
   {
     int i=2,x=3;
     switch(i)
     {
       case 0:
         if(x==3)
         {
           int y=12;
       case 1:
           i--;
       case 2:
           i--;
         }
     }
     printf("i = %i\n",i);
     return 0;
   }
Questo (orribile) programma e' codice legale C ma non e' codice
legale C++ in quanto i case 1 e 2 dello switch scavalcano
l'inizializzazione di y.
E' importante ricordare (anche se la cosa mi ha sempre
disturbato un poco) che "switch" non e' una struttura di
controllo simile a if o while... ma e' semplicemente una
serie di goto: un parente molto stretto del famoso/famigerato
"on ... goto" del BASIC. Questo spiega anche l'apparente
assurdita' del fatto che finito di elaborare un "case" il
controllo caschi dentro al "case" successivo se non viene
messo un "break".
Andrea
--
Andrea Griffini, Programmer
http://www.netservers.com/~agriff