Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

error C2361: initialization of 'found' is skipped by 'default' label [duplicate]

Possible Duplicate:
Why can't variables be declared in a switch statement?

I have a strange error in my code below:

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

Visual Studio 2010 compiler says that:

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'

I think that I have correctly written break and default statements, so where is the error?

like image 717
dato datuashvili Avatar asked Apr 30 '12 09:04

dato datuashvili


3 Answers

You need to either enclose your case 'f': with a scoped brace:

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

or place the declaration of found outside of the switch

like image 169
Component 10 Avatar answered Oct 20 '22 16:10

Component 10


The semantics of a switch are those of a goto: cases don't introduce a new scope. So found is accessible in your default: case (although you don't actually access it). Jumping over a non-trivial initialization is illegal, so your code becomes illegal.

Given the complexity of your case 'f':, the best solution is probably to factor it out into a separate function. Failing that, you can put the entire case in {...}, creating a separate scope, or forgo the initialization, writing:

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

(I mention this for completeness. It is not the solution I would recomment.)

like image 44
James Kanze Avatar answered Oct 20 '22 16:10

James Kanze


You need to declare the internal variables of switch's case within curly braces. i.e.

case 'f' :
{
    ...
    int found=thetree->find(value);
    ...
}
like image 42
iammilind Avatar answered Oct 20 '22 15:10

iammilind