2012-04-30 1 views
11

Eventuali duplicati:
Why can't variables be declared in a switch statement?errore C2361: l'inizializzazione di 'trovato' viene saltato da 'default' etichetta

Ho un errore di strano nel mio codice qui sotto:

char choice=Getchar(); 
switch(choice) 
{ 
case 's': 
    cout<<" display tree "; 
    thetree->displaytree(); 
    break; 

case 'i': 
    cout<<" enter value to insert "<<endl; 
    cin>>value; 
    thetree->insert(value); 
    break; 
case 'f' : 
    cout<< "enter value to find "; 
    cin>>value; 
    int found=thetree->find(value); 
    if(found!=-1) 
     cout<<" found = "<<value<<endl; 
     else 
      cout<< " not found " <<value <<endl; 
     break; 
default: 
    cout <<" invalid entry "<<endl;; 
    } 

Il compilatore di Visual Studio 2010 dice che:

1>c:\users\daviti\documents\visual studio 2010\projects\2-3-4\2-3-4\2-3-4.cpp(317): error C2361: initialization of 'found' is skipped by 'default' label 
1>   c:\users\daviti\documents\visual studio 2010\projects\2-3-4\2-3-4\2-3-4.cpp(308) : see declaration of 'found' 

Penso di aver scritto correttamente le frasi di interruzione e di default, quindi dov'è l'errore?

+3

-1 per dare un sacco di codice irrilevante quando il messaggio di errore indica chiaramente dove si trova il codice problematico. –

+4

Quando scomparve l'antica arte di leggere i messaggi di errore ... – PlasmaHH

+6

Questo è solo un duplicato esatto se conosci già la risposta al problema. L'errore "criptico" C2361: inizializzazione di "trovato" viene saltato da "etichetta" predefinita "non porta necessariamente alla domanda" Perché le variabili non possono essere dichiarate in un'istruzione switch? " –

risposta

43

è necessario o allegare il case 'f': con una doppietta di ambito:

case 'f' : 
{ 
    cout<< "enter value to find "; 
    cin>>value; 
    int found=thetree->find(value); 
    if(found!=-1) 
     cout<<" found = "<<value<<endl; 
    else 
     cout<< " not found " <<value <<endl; 
    break; 
} 

o collocare la dichiarazione di found al di fuori dei switch

6

È necessario dichiarare le variabili interne dello case di all'interno di parentesi graffe. cioè

case 'f' : 
{ 
    ... 
    int found=thetree->find(value); 
    ... 
} 
+0

Non è sufficiente dirmi cosa fare. È necessario scrivere anche una o due frasi sul perché. –

16

La semantica di un switch sono quelli di un goto: case s non introdurre un nuovo ambito. Quindi found è accessibile nel tuo caso default: (anche se in realtà non lo si accede). Saltare su un'inizializzazione non banale è illegale, quindi il tuo codice diventa illegale.

Data la complessità del vostro case 'f':, la soluzione migliore è probabilmente per calcolarlo in una funzione separata. In mancanza di questo, si può mettere l'intero caso in {...}, creando un ambito separato, o rinunciare alla di inizializzazione, la scrittura:.

int found; 
found = thetree->find(value); 

(Dico questo per completezza è non la soluzione che sarebbe consiglio.)

+5

Voto positivo per una spiegazione reale. – Fulluphigh

+0

"' case's non introduce un nuovo scope "- questa frase spiega tutto. –