Switch-case problem

C

Chih-Hsu Yen

I encountered a strange problem about switch-case statement.
switch(cmd)
{
case 1: statements; break;
case 2: statements; break;
... ....
case 11: S1;
S2;
S3;
statements;
break;
... ...
case xx
}

When the cmd is above 11, the first two statements are skipped. Take case 11
as example
the first executing statement is S3, not S1.
What the problem is?
 
R

Richard Bos

Chih-Hsu Yen said:
I encountered a strange problem about switch-case statement.
switch(cmd)
{
case 1: statements; break;
case 2: statements; break;
... ....
case 11: S1;
S2;
S3;
statements;
break;
... ...
case xx
}

When the cmd is above 11, the first two statements are skipped. Take case 11
as example
the first executing statement is S3, not S1.
What the problem is?

I've no idea, and it would be very hard to tell without seeing your
actual code. For example, what _are_ S1, S2, and S3? How is cmd defined?
What is the case just before case 11? Show your real code, and we may be
able to help.

Richard
 
C

Chih-Hsu Yen

Most cases have analogous format as case 10, so I only pasted case 10.
It seems that the first two statements are skipped, no matter what they are,
while the case number is above 10.
Therefore, I thought that the problem may be caused by the codes in case 10,
but I can not figure out how could this happen.

-------------
scanf("%d",&cmd);

switch(cmd){
case 1: similar as case 10

case 2: similar as case 10

case 3: similar as case 10

case 10: /*insert inbound SPD*/
spd_udp.opcode = SPD_IN_INSERT;
printf("please input the addr1 & addr2 (XX XX, XX=00-3F): ");
scanf("%x %x",&addr1,&addr2);
printf("please select an action : \n");
printf("1: bypass \n");
printf("2: IPsec \n");
printf("3: disard \n");
scanf("%d",&sel);
if(sel == 1)
{
entry_spd.ctrl.action_index = 0;
entry_spd.ctrl.next_index = 0;
}
else if(sel == 2)
{
entry_spd.ctrl.action_index = 64;
entry_spd.ctrl.next_index = 0;
}
else if(sel == 3)
{
entry_spd.ctrl.action_index = 128;
entry_spd.ctrl.next_index = 0;
}
else
{
printf("error selection!! \n");
break;
}
spd_udp.oper.operand_addr1 = addr1;
spd_udp.oper.operand_addr2 = addr2;
sendstring[0] = spd_udp.opcode;
sendstring[1] = spd_udp.oper.operand_addr1;
sendstring[2] = spd_udp.oper.operand_addr2;
sendstring[3] = entry_spd.ctrl.action_index;
sendstring[4] = entry_spd.ctrl.next_index;
sendstring[5] = 0;
sendstring[6] = entry_spd.protocol;
printf("please input sip value (XX XX XX XX, XX=00-FF): ");
scanf("%x %x %x %x", &b[0], &b[1], &b[2], &b[3]);
entry_spd.sip = word_build(b[0],b[1],b[2],b[3]);
for (i=7; i<11; i++)
{
sendstring = b[i-7];
}
printf("please input sip Mask value (XX XX XX XX, XX=00-FF): ");
scanf("%x %x %x %x", &b[0], &b[1], &b[2], &b[3]);
entry_spd.sipMask = word_build(b[0],b[1],b[2],b[3]);
for (i=11; i<15; i++)
{
sendstring = b[i-11];
}
printf("please input dip value (XX XX XX XX, XX=00-FF): ");
scanf("%x %x %x %x", &b[0], &b[1], &b[2], &b[3]);
entry_spd.dip = word_build(b[0],b[1],b[2],b[3]);
for (i=15; i<19; i++)
{
sendstring = b[i-16];
}
printf("please input dip Mask value (XX XX XX XX, XX=00-FF): ");
scanf("%x %x %x %x", &b[0], &b[1], &b[2], &b[3]);
entry_spd.dipMask = word_build(b[0],b[1],b[2],b[3]);
for (i=19; i<23; i++)
{
sendstring = b[i-19];
}
printf("please input spMaxMin value (XX XX XX XX, XX=00-FF): ");
scanf("%x %x %x %x", &b[0], &b[1], &b[2], &b[3]);;
entry_spd.spMaxMin = word_build(b[0],b[1],b[2],b[3]);
for (i=23; i<27; i++)
{
sendstring = b[i-23];
}
printf("please input dpMaxMin value (XX XX XX XX, XX=00-FF): ");
scanf("%x %x %x %x", &b[0], &b[1], &b[2], &b[3]);
entry_spd.dpMaxMin = word_build(b[0],b[1],b[2],b[3]);
for (i=27; i<31; i++)
{
sendstring = b[i-27];
}
insert_isp(spd_udp.oper,entry_spd);
sendsocket(sendstring,SPD_INTPAC_LEN);
c=getchar();
break;
}
 
M

Minti

Chih-Hsu Yen said:
Most cases have analogous format as case 10, so I only pasted case 10.
It seems that the first two statements are skipped, no matter what they are,
while the case number is above 10.
Therefore, I thought that the problem may be caused by the codes in case 10,
but I can not figure out how could this happen.

Could you by any means step through your code and see what is going on?


<snip code>
 
C

Chih-Hsu Yen

It's really strange. I marked all statements as comments and left "break"
statement only in case 10.
However, the first two statements of case 11 are still skipped.
But, if I remove all statements and left "break" statement in case 10.
The execution of case 11 is correct.
Do there have restrictions on the number of lines in switch-case statement,
no matter what they are statements or comments?
 
C

CBFalconer

*** top-posting corrected ***
Chih-Hsu Yen said:
It's really strange. I marked all statements as comments and left
"break" statement only in case 10. However, the first two
statements of case 11 are still skipped. But, if I remove all
statements and left "break" statement in case 10. The execution
of case 11 is correct. Do there have restrictions on the number
of lines in switch-case statement, no matter what they are
statements or comments?

You almost certainly have undefined behaviour somewhere, which
might even be writing into a jump table. Simplify your code so
that errors stand out. That usually means splitting off
subroutines to do jobs.

Please do not top-post. Your answer belongs after, or intermixed
with, the material to which you reply, with non-germane portions
snipped out. Top-posting is generally considered rude, boorish and
inconsiderate.
 
B

Bjoern Pedersen

Chih-Hsu Yen said:
Most cases have analogous format as case 10, so I only pasted case 10.
It seems that the first two statements are skipped, no matter what they are,
while the case number is above 10.
Therefore, I thought that the problem may be caused by the codes in case 10,
but I can not figure out how could this happen.

now a "\n" is still in the input stream...
switch(cmd){
case 1: similar as case 10

case 2: similar as case 10

case 3: similar as case 10

case 10: /*insert inbound SPD*/
spd_udp.opcode = SPD_IN_INSERT;
printf("please input the addr1 & addr2 (XX XX, XX=00-3F): ");
scanf("%x %x",&addr1,&addr2);

this scanf is "skipped" due to the "\n" in the input stream...

.... an so on

Björn
 
M

Minti

Bjoern said:
now a "\n" is still in the input stream...


this scanf is "skipped" due to the "\n" in the input stream...

Nopes, the scanf here won't be skipped. It would be skipped only if we
were taking a character which it isn't taking.

It seems to be different problem altogether. I believe that the OP is,
just doing something else that makes him believe that the the
statements are skipped.
 
C

Carlos

Chih-Hsu Yen said:
Most cases have analogous format as case 10, so I only pasted case 10.
It seems that the first two statements are skipped, no matter what they are,
while the case number is above 10.
Therefore, I thought that the problem may be caused by the codes in case 10,
but I can not figure out how could this happen.
[...]
switch(cmd){
case 1: similar as case 10

case 2: similar as case 10

case 3: similar as case 10

case 10: /*insert inbound SPD*/
spd_udp.opcode = SPD_IN_INSERT; [...]
sendsocket(sendstring,SPD_INTPAC_LEN);
c=getchar();
break;
}

Did you really close your switch after case 10, or can we assume that
case 11 starts after the break and before the brace?
 
M

Michael Wojcik

this scanf is "skipped" due to the "\n" in the input stream...

And the output from the printf will likely not have appeared yet,
because stdout is probably in line-buffering mode, no newline has
been written, and stdout has not been flushed.

We might have more confidence in claims about statements being
"skipped" if they were written to have visible effects, and if you
checked whether they failed. (scanf returns a value for a reason.)

C seems to attract the sort of programmer who throws code at a
problem and hopes it will all work correctly. This approach does not
always produce ideal results.

--
Michael Wojcik (e-mail address removed)

The antics which have been drawn together in this book are huddled here
for mutual protection like sheep. If they had half a wit apiece each
would bound off in many directions, to unsimplify the target. -- Walt Kelly
 
C

Chih-Hsu Yen

Carlos said:
Chih-Hsu Yen said:
Most cases have analogous format as case 10, so I only pasted case 10.
It seems that the first two statements are skipped, no matter what they
are, while the case number is above 10.
Therefore, I thought that the problem may be caused by the codes in case
10,
but I can not figure out how could this happen.
[...]
switch(cmd){
case 1: similar as case 10

case 2: similar as case 10

case 3: similar as case 10

case 10: /*insert inbound SPD*/
spd_udp.opcode = SPD_IN_INSERT; [...]
sendsocket(sendstring,SPD_INTPAC_LEN);
c=getchar();
break;
}

Did you really close your switch after case 10, or can we assume that case
11 starts after the break and before the brace?

I solved the problem by deleting "sendsocket(sendstring, SPD_INTPAC_LEN);"
and retyping it again.
I still can not figure out what happened, but it is fixed.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,769
Messages
2,569,579
Members
45,053
Latest member
BrodieSola

Latest Threads

Top