2012-04-30 10 views
11

Powiel możliwe:
Why can't variables be declared in a switch statement?error C2361: inicjalizacja 'odnaleziono' jest pomijany przez 'domyślnie' label

Mam dziwny błąd w moim kodu poniżej:

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;; 
    } 

Kompilator Visual Studio 2010 mówi:

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' 

Myślę, że poprawnie napisałem instrukcje break i default, więc gdzie jest błąd?

+3

-1 za podawanie wielu nieistotnych kodów, gdy komunikat o błędzie wyraźnie wskazuje, gdzie występuje problematyczny kod. –

+4

Kiedy zniknęła starożytna sztuka czytania komunikatów o błędach ... – PlasmaHH

+6

To tylko dokładny duplikat, jeśli znasz już odpowiedź na problem. Krytyczny "błąd C2361: inicjalizacja" znalezionego "jest pomijany przez" domyślną "etykietę" niekoniecznie prowadzi do pytania "Dlaczego nie można zadeklarować zmiennych w instrukcji switch?" –

Odpowiedz

43

Trzeba też załączyć case 'f': z określania zakresów klamra:

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; 
} 

lub umieścić deklarację found zewnętrznej stronie switch

6

Należy zadeklarować wewnętrzne zmienne switch 's case w nawiasy klamrowe. tj

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

Nie wystarczy mi powiedzieć, co mam robić. POTRZEBUJESZ również napisać zdanie lub dwa, dlaczego. –

16

semantyki w switch są tymi o goto: case s nie wprowadzenie nowego zakresu. Tak więc found jest dostępny w twoim default: przypadku (chociaż w rzeczywistości nie masz do niego dostępu). Przeskakiwanie nietrywialnej inicjalizacji jest nielegalne, więc Twój kod staje się nielegalny.

Biorąc pod uwagę złożoność modelu case 'f':, najlepszym rozwiązaniem jest prawdopodobnie w celu rozpropagowania go w oddzielnej funkcji. W przypadku jego braku, można umieścić całą sprawę w {...}, tworząc odrębny zakres lub zaniechaniu inicjalizacji, w piśmie:.

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

(wspominam o tym dla kompletności Jest nie rozwiązanie bym recomment.)

+5

Awansuj o prawdziwe wyjaśnienie. – Fulluphigh

+0

"Sprawy" nie wprowadzają nowego zakresu "- to zdanie wyjaśnia wszystko. –