Go Back   Velocity Reviews > Newsgroups > C++
User Name
Password
Register FAQ Members List Calendar Search Today's Posts Mark Forums Read

Reply

C++ - error: jump to case label

 
Thread Tools Search this Thread
Old 04-02-2004, 11:09 PM   #1
Default error: jump to case label


Hello,

Does anyone know what the following g++ compiler error message means:

error: jump to case label

I get this error when switching two case labels together with their bodies.
I have no setjmp/longjmp or gotos in my program.

Thanks,

Neil


Neil Zanella
  Reply With Quote
Old 04-02-2004, 11:31 PM   #2
Bill Seurer
 
Posts: n/a
Default Re: error: jump to case label

Neil Zanella wrote:

> I get this error when switching two case labels together with their bodies.


Explain that further or better yet post the offending code.
  Reply With Quote
Old 04-03-2004, 01:41 PM   #3
James Gregory
 
Posts: n/a
Default Re: error: jump to case label

On Fri, 02 Apr 2004 15:09:00 -0800, Neil Zanella wrote:

> Hello,
>
> Does anyone know what the following g++ compiler error message means:
>
> error: jump to case label
>
> I get this error when switching two case labels together with their bodies.
> I have no setjmp/longjmp or gotos in my program.
>


Perhaps the problem is "jump to case label croses initialization"?

The following is not allowed:

switch (a)
{
case 1:
int a = 6;
//stuff
break;

case 2:
//stuff
break;
}

The following is allowed:

switch (a)
{
case 1:
{
int a = 6;
//stuff
}
break;

case 2:
//stuff
break;
}

James

  Reply With Quote
Old 04-03-2004, 07:11 PM   #4
Neil Zanella
 
Posts: n/a
Default Re: error: jump to case label

Bill Seurer <> wrote in message news:<c4kt55$1ahs$>...
> Neil Zanella wrote:
>
> > I get this error when switching two case labels together with their bodies.

>
> Explain that further or better yet post the offending code.


Sure I will. Here is the code. Uncommenting the lines for case 1 produces
the compiler error message. Furthermore, out of curiosity, as an unrelated
matter, I am quite interested in knowing how come the program starts looping
when some large number is entered.

Thanks,

Neil

#include <iostream>

int main() {
unsigned int x; do {
std::cout << "Please enter an integer: " << std::flush;
std::cin >> x;
switch (x) {
case 0:
std::cout << "Hello!" << std::endl;
break;
default:
unsigned int y = ++x;
std::cout << "You could have entered " << y;
std::cout << ". Why didn't you?" << std::endl;
break;
//case 1:
// std::cout << "What??? You entered one?" << std::endl;
// break;
}
} while (x != 0);
}
  Reply With Quote
Old 04-04-2004, 04:07 AM   #5
Jacek Dziedzic
 
Posts: n/a
Default Re: error: jump to case label

Neil Zanella wrote:
> Sure I will. Here is the code. Uncommenting the lines for case 1 produces
> the compiler error message.


Try moving them before the 'default'

> Furthermore, out of curiosity, as an unrelated
> matter, I am quite interested in knowing how come the program starts looping
> when some large number is entered.


cin.fail() is set and all subsequent ">>" operations are ignored,
with x unmodified every time. Hence, if x happened to be non-zero,
the loop iterates infinitely.

>
> Thanks,
>
> Neil
>
> #include <iostream>
>
> int main() {
> unsigned int x; do {
> std::cout << "Please enter an integer: " << std::flush;
> std::cin >> x;
> switch (x) {
> case 0:
> std::cout << "Hello!" << std::endl;
> break;
> default:
> unsigned int y = ++x;
> std::cout << "You could have entered " << y;
> std::cout << ". Why didn't you?" << std::endl;
> break;
> //case 1:
> // std::cout << "What??? You entered one?" << std::endl;
> // break;
> }
> } while (x != 0);
> }


HTH,
- J.
  Reply With Quote
Old 04-04-2004, 11:22 AM   #6
Neil Zanella
 
Posts: n/a
Default Re: error: jump to case label

Jacek Dziedzic <jacek__NOSPAM__@janowo.net> wrote in message:

> Try moving them before the 'default'


Thank you for your reply...
I know that works but that doens't really explain the nature of the problem.

Regards,

Neil

> > #include <iostream>
> >
> > int main() {
> > unsigned int x; do {
> > std::cout << "Please enter an integer: " << std::flush;
> > std::cin >> x;
> > switch (x) {
> > case 0:
> > std::cout << "Hello!" << std::endl;
> > break;
> > default:
> > unsigned int y = ++x;
> > std::cout << "You could have entered " << y;
> > std::cout << ". Why didn't you?" << std::endl;
> > break;
> > //case 1:
> > // std::cout << "What??? You entered one?" << std::endl;
> > // break;
> > }
> > } while (x != 0);
> > }

>
> HTH,
> - J.

  Reply With Quote
Old 04-04-2004, 02:47 PM   #7
Buster
 
Posts: n/a
Default Re: error: jump to case label

Neil Zanella wrote:

> Jacek Dziedzic <jacek__NOSPAM__@janowo.net> wrote in message:
>
>> Try moving them before the 'default'

>
> Thank you for your reply...
> I know that works but that doens't really explain the nature of the problem.


Please don't top-post.

>>>#include <iostream>
>>>
>>>int main() {
>>> unsigned int x; do {
>>> std::cout << "Please enter an integer: " << std::flush;
>>> std::cin >> x;
>>> switch (x) {
>>> case 0:
>>> std::cout << "Hello!" << std::endl;
>>> break;
>>> default:
>>> unsigned int y = ++x;
>>> std::cout << "You could have entered " << y;
>>> std::cout << ". Why didn't you?" << std::endl;
>>> break;
>>> //case 1:
>>> // std::cout << "What??? You entered one?" << std::endl;
>>> // break;
>>> }
>>> } while (x != 0);
>>>}


James Gregory is right. The 'jump' in the error message is the computed
goto effected by the switch statement. When x = 1, the switch acts like
this:

goto case_label_1;
// ...
unsigned int y = ++ x;
// ...
case_label_1:
// here y is uninitialized

The problem is that the initialization of y is skipped when x == 1.
When the "case 1:" label is reached, stack space has been allocated for
y but its value has not been initialized. This is not allowed.

The general way round this situation is to make the scope of y smaller
by adding braces:

switch (x)
{
default:
unsigned z; // this is OK since z is uninitialized
{
unsigned y = x + 1;
// ...
}
case 1:
z = 2;
// ...
// cannot refer to y here so no problem with y's initialization
}

--
Regards,
Buster.
  Reply With Quote
Reply


Thread Tools Search this Thread
Search this Thread:

Advanced Search

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

vB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Forum Jump