By using this site, you agree to our updated Privacy Policy and our Terms of Use. Manage your Cookies Settings.
443,627 Members | 2,339 Online
Bytes IT Community
+ Ask a Question
Need help? Post your question and get tips & solutions from a community of 443,627 IT Pros & Developers. It's quick & easy.

Switch-case problem

P: n/a
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?
Nov 14 '05 #1
Share this Question
Share on Google+
10 Replies


P: n/a
"Chih-Hsu Yen" <zs****@ms14.hinet.net> wrote:
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
Nov 14 '05 #2

P: n/a
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[i] = 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[i] = 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[i] = 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[i] = 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[i] = 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[i] = b[i-27];
}
insert_isp(spd_udp.oper,entry_spd);
sendsocket(sendstring,SPD_INTPAC_LEN);
c=getchar();
break;
}
"Richard Bos" <rl*@hoekstra-uitgeverij.nl> glsD:42***************@news.xs4all.nl...
"Chih-Hsu Yen" <zs****@ms14.hinet.net> wrote:
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

Nov 14 '05 #3

P: n/a

Chih-Hsu Yen wrote:
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>

--
Imanpreet Singh Arora

Nov 14 '05 #4

P: n/a
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?

"Minti" <im*******@gmail.com>
???????:11*********************@z14g2000cwz.google groups.com...

Chih-Hsu Yen wrote:
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>

--
Imanpreet Singh Arora

Nov 14 '05 #5

P: n/a
*** top-posting corrected ***
Chih-Hsu Yen wrote:
"Minti" <im*******@gmail.com>
Chih-Hsu Yen wrote:

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?


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.

--
"If you want to post a followup via groups.google.com, don't use
the broken "Reply" link at the bottom of the article. Click on
"show options" at the top of the article, then click on the
"Reply" at the bottom of the article headers." - Keith Thompson

Nov 14 '05 #6

P: n/a
"Chih-Hsu Yen" <zs****@ms14.hinet.net> writes:
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);
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

Bjrn
--
Bjoern Pedersen

Nov 14 '05 #7

P: n/a

Bjoern Pedersen wrote:
"Chih-Hsu Yen" <zs****@ms14.hinet.net> writes:
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);


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...


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.

--
Imanpreet Singh Arora

Nov 14 '05 #8

P: n/a
Chih-Hsu Yen wrote:
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?
Nov 14 '05 #9

P: n/a

In article <m3************@resi2.office.frm2>, Bjoern Pedersen <Bj*************@frm2.tum.de> writes:
"Chih-Hsu Yen" <zs****@ms14.hinet.net> writes:
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...


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 mi************@microfocus.com

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
Nov 14 '05 #10

P: n/a
"Carlos" <an***@quovadis.com.ar> ???????:d3**********@domitilla.aioe.org...
Chih-Hsu Yen wrote:
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.
Nov 14 '05 #11

This discussion thread is closed

Replies have been disabled for this discussion.