打印

while多层循环跳出的问题

[复制链接]
1676|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
3B1105|  楼主 | 2010-3-19 10:22 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
while(1)
{
seek_scan(1);      
if(band==0)
{   
if(++chdisplay>9)
{
chdisplay=0;
//如果满足条件跳出整个while循环应该加什么语句呢
}
if(fm_freq1==760) //如果满足条件跳出整个while循环 应该加什么语句呢     
}
else if(band==1)
{
if(++chdisplay>19)  
{
chdisplay=0;
//如果满足条件跳出整个while循环
}
if(fm_freq2==870)//如果满足条件跳出整个while循环 应该加什么语句呢
}
else //if(band==2)
{
if(++chdisplay>19)  
{
chdisplay=0;
//如果满足条件跳出整个while循环 应该加什么语句呢
}
if(am_freq==522) //如果满足条件跳出整个while循环 应该加什么语句呢
}

i=chdisplay;
i<<=1;//为了得到正确频率存储位子
  
if(band==0)
{
// fmch1=chdisplay;
fm_channel1[i]=fm_freq1/256;
fm_channel1[i+1]=fm_freq1%256;
}
else if(band==1)
{
// fmch2=chdisplay;
fm_channel2[i]=fm_freq2/256;
fm_channel2[i+1]=fm_freq2%256;
}
else//if(band==3)
{
//amch=chdisplay;
am_channel[i]=am_freq/256;
am_channel[i+1]=am_freq%256;
}
}
请教一下如果要退出整个while应该加什么语句好呢,加break好吗??

相关帖子

沙发
6019实验室| | 2010-3-19 10:25 | 只看该作者
单个while可用break跳出,多层循环时goto也行,但是为了程序的严谨性(goto好像没有处理堆栈)我一般把整个while做成一个函数,在需要退出while的地方return,  然后在主程序中调用这个函数就可以了。

void main()
{
  ...
  ...
  fun1();
  ...
}

void fun1()
{
while(1)
{
    if (xxx>1)
      return;
    ...
    ...
    ...
    while (1)
    {
     ...
     ...
     if (xxxx<1)
       return;
    }
}
}  
 

使用特权

评论回复
板凳
6019赵文| | 2010-3-19 10:27 | 只看该作者
单个while可用break跳出,多层循环时goto也行,但是为了程序的严谨性(goto好像没有处理堆栈)我一般把整个while做成一个函数,在需要退出while的地方return,  然后在主程序中调用这个函数就可以了。
void main()
{
  ...
  ...
  fun1();
  ...
}

void fun1()
{
while(1)
{
    if (xxx>1)
      return;
    ...
    ...
    ...
    while (1)
    {
     ...
     ...
     if (xxxx<1)
       return;
    }
}
}  
   
2009-11-12,08:28:17   资料  邮件  回复  引用回复           编辑  删除   

【4楼】 wwwdege
积分:17
派别:
等级:------
来自:
你好
while(1)
{
seek_scan(1);//进入ATS     
if(band==0)
{   
if(++chdisplay>9)
{
chdisplay=0;
goto table;
}
if(fm_freq1==760)
{
set_bit(flag5,channel_ats);
goto table;  
}
   
}
else if(band==1)
{
if(++chdisplay>19)  
{
chdisplay=0;
goto table;
}
if(fm_freq2==870) goto table;  
}
else //if(band==2)
{
if(++chdisplay>19)  
{
chdisplay=0;
goto table;
}
if(am_freq==522) goto table;
}

i=chdisplay;
i<<=1;//为了得到正确频率存储位子   
if(band==0)
{
// fmch1=chdisplay;
fm_channel1[i]=fm_freq1/256;
fm_channel1[i+1]=fm_freq1%256;
}
else if(band==1)
{
// fmch2=chdisplay;
fm_channel2[i]=fm_freq2/256;
fm_channel2[i+1]=fm_freq2%256;
}
else//if(band==3)
{
//amch=chdisplay;
am_channel[i]=am_freq/256;
am_channel[i+1]=am_freq%256;
}
}
table:
if(band==0)
{
fm_freq1=fm_channel1[0]*256+fm_channel1[1] ;
set_freq(fm_freq1*10);   //频率调整
}   
else if(band==1)
{
fm_freq2=fm_channel2[0]*256+fm_channel2[1];
set_freq(fm_freq2*10);   //频率调整
}   
else
{
am_freq=(am_channel[0]*256+am_channel[1]);
set_freq(am_freq);  
}
我也试过goto,可是运行到跳出while循环到table时 出错了,如果用break仿真时好像可以跳出整个while循环(IAR编译器)
我在电脑上查看fm_channel1[0]的值是0x02;fm_channel1[10]的值是0xf8
而fm_freq1得值却是519,如果正确的值应该是fm_freq1=(0x02*256+0xf8)

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

315

主题

1645

帖子

4

粉丝