搜索
bottom↓
回复: 9

while多层循环跳出的问题

[复制链接]

出0入0汤圆

发表于 2009-11-12 01:18:39 | 显示全部楼层 |阅读模式
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=fm_freq1/256;
                        fm_channel1[i+1]=fm_freq1%256;                                                               
                }
        else if(band==1)
                {
                //        fmch2=chdisplay;       
                        fm_channel2=fm_freq2/256;
                fm_channel2[i+1]=fm_freq2%256;       
                }
        else//if(band==3)
                {
                        //amch=chdisplay;       
                        am_channel=am_freq/256;
                        am_channel[i+1]=am_freq%256;                                                                                       
                }                                               
        }
请教一下如果要退出整个while应该加什么语句好呢,加break好吗??

阿莫论坛20周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入0汤圆

发表于 2009-11-12 02:03:26 | 显示全部楼层
你不知道C语言中有个保留字叫做 goto 么?

出0入33汤圆

发表于 2009-11-12 08:28:17 | 显示全部楼层
单个while可用break跳出,多层循环时goto也行,但是为了程序的严谨性(goto好像没有处理堆栈)我一般把整个while做成一个函数,在需要退出while的地方return,  然后在主程序中调用这个函数就可以了。

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

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

出0入0汤圆

发表于 2009-11-12 08:33:17 | 显示全部楼层
【2楼】 vtte

单个while可用break跳出,多层循环时goto也行,但是为了程序的严谨性(goto好像没有处理堆栈)我一般把整个while做成一个函数,在需要退出while的地方return,  然后在主程序中调用这个函数就可以了。

=============================================

多重循环本身就跟堆栈扯不上什么关系,即便是 C++ 规范中的变量随时定义,也并不是说定义时候才分配栈空间的

出0入0汤圆

 楼主| 发表于 2009-11-12 09:55:20 | 显示全部楼层
你好
        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=fm_freq1/256;
                                fm_channel1[i+1]=fm_freq1%256;                                                               
                        }
                else if(band==1)
                        {
                        //        fmch2=chdisplay;       
                                fm_channel2=fm_freq2/256;
                        fm_channel2[i+1]=fm_freq2%256;       
                        }
                else//if(band==3)
                        {
                                //amch=chdisplay;       
                                am_channel=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)

出0入0汤圆

发表于 2009-11-12 11:35:08 | 显示全部楼层
goto好像没有处理堆栈。。。。

跟堆栈无关,但是如果有动态内存申请,要记得释放

出0入0汤圆

发表于 2009-11-12 11:44:53 | 显示全部楼层
如果实在太过不喜欢用 goto,也可以尝试使用

try...catch 结构

不过,这并不是在每一种编译器和平台架构中都能完整实现的,真用起来,还不如 goto 安全

出0入0汤圆

发表于 2009-11-12 12:35:30 | 显示全部楼层
就一重循环,break就完了嘛,哪有那么多麻烦,break和if没有任何关系。

出0入0汤圆

 楼主| 发表于 2009-11-13 10:05:17 | 显示全部楼层
确实是一重循环,一个break就够了

出0入0汤圆

发表于 2010-10-21 08:51:31 | 显示全部楼层
实在跳不出,GOTO 强制出去……哈哈!
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-6-3 01:11

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表