单个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)
|