如何打破 C 中的无限 for(;;) 循环?
Posted
技术标签:
【中文标题】如何打破 C 中的无限 for(;;) 循环?【英文标题】:How to break an infinite for(;;) loop in C? 【发布时间】:2012-03-04 19:16:53 【问题描述】:我有一个至关重要的无限 for 循环,它允许传感器不断更新其值。但是,当另一个传感器引入新值时,我想打破这个 for 循环。如何从一个无限 for 循环切换到另一个?
当前代码:
for(;;)
SON_Start();
// Wait 65ms for max range time
delay10ms(7);
// Read Range
i = SON_Read(SON_ADDRESSES[sonarReading]);
// pause
delayMs(100);
if(i<15)
drive(200, RadCW);
我想补充的:
如果Sensor2
返回读数(例如Sensor2 > 20
),那么我想中断循环并转到另一个无限 for 循环以开始一个新函数。
【问题讨论】:
请不要关闭这个问题,伙计们。并且,将来,如果您再次出现这种情况,请标记以引起版主注意。我们更愿意尝试挽救局面,而不是重新发布问题。 【参考方案1】:“break”命令应该做你需要的?
【讨论】:
【参考方案2】:您使用break;
来中断循环并将控制权传递到其右大括号之外。例如
for(;;)
if( whatever )
break;
//break gets you here
【讨论】:
【参考方案3】:这将在循环 A 和循环 B 之间切换。
for (;;)
// Loop A
for (;;)
if WANT_TO_SWITCH
break;
// Loop B
for (;;)
if WANT_TO_SWITCH
break;
【讨论】:
【参考方案4】:如果您正在寻找“在 2 个无限循环之间切换”,它可能会被第三个循环“包裹”,而这种“切换”可以通过简单的 break
来完成。
但既然你希望你的程序有一天停止,这个循环可以放在函数中,你可以使用return;
来结束它:
void myMagicLoop()
for(;;)
for(;;)
if ( I should stop )
return;
if ( I should switch to second loop )
break;
for(;;)
if ( I should stop )
return;
if ( I should switch back to first loop)
break;
还有你可以打电话的地方:
myMagicLoop();
希望这会有所帮助。
【讨论】:
您能否为这个例子扩展一下 return 背后的想法?你能实现一个快速的示例代码吗?我只是无法让它工作。 @Fendi:我已经更新了我的答案。现在应该很清楚了。 谢谢!I should stop
if 语句会返回一个值,该值可用于终止循环或用于其他 if 语句?
@Fendi : function myMagicLoop
可以返回一些值,然后您将 return;
替换为 return value;
是的,您可以在调用此函数的代码中使用此值: value = myMagicLoop(); if (value...) ...
。如果这是您所要求的。
@ChrisLutz:有很多人考虑使用goto
“可接受”,也有很多人宁愿更改他们的代码以避免使用它。假设我属于第二组。【参考方案5】:
或者,您可以考虑使用事件驱动的方法重写它。这当然取决于您的硬件的能力,但至少您应该能够产生一些计时器事件。
然后代码会变成这样:
static volatile bool sensor_1_ready;
static volatile bool sensor_2_ready;
for(;;)
switch(state_machine)
case READING_SENSOR_1:
if(sensor_2_ready)
state_machine = READING_SENSOR_2;
else if(sensor_1_ready)
process sensor 1
break;
case READING_SENSOR_2:
if(!sensor_2_ready && some_timeout_etc)
state_machine = READING_SENSOR_1;
else if(sensor_2_ready)
process sensor 2
break;
void callback_sensor_1 (void) // some sort of interrupt or callback function
sensor_1_ready = true;
void callback_sensor_2 (void) // some sort of interrupt or callback function
sensor_2_ready = true;
(在评论 volatile 变量之前,请注意 volatile 是为了防止危险的编译器优化,不是用作一些互斥锁/原子访问/内存屏障等等)
【讨论】:
这很有帮助,谢谢 :) 我喜欢这里使用 case 函数的方式【参考方案6】:最好的方法是将for
语句更改为:
for (; Sensor2 <= 20;)
...
或者,您可以将其从 for
更改为 while
语句:
while (Sensor2 <= 20)
...
如果这不能满足您的需求,您可以随时使用 break
。
【讨论】:
【参考方案7】:另一种选择是使用信号 (SIGUSR1,SIGUSR2) 从一个循环切换到另一个循环。 类似的东西:
void sensor2(int signum)
for (; ;)
...
/* Need to process sensor 1 now */
kill(pid, SIGUSR1);
void sensor1(int signum)
for (; ;)
...
/* Need to process sensor 2 now */
kill(pid, SIGUSR2);
int main()
/* register the signal handlers */
signal(SIGUSR1, sensor1);
signal(SIGUSR2, sensor2);
...
【讨论】:
这类似于使用信号量吗?以上是关于如何打破 C 中的无限 for(;;) 循环?的主要内容,如果未能解决你的问题,请参考以下文章