我有一个至关重要的无限循环,允许传感器不断更新其值。但是,当另一个传感器带来新值时,我想打破这个循环。如何从一个无限循环切换到另一个?
当前代码:
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
),那么我想打破循环并转到另一个无限循环以开始一个新函数。
答案 0 :(得分:27)
如果您正在寻找“在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();
希望这有帮助。
答案 1 :(得分:8)
这将在循环A和循环B之间切换。
for (;;)
{
// Loop A
for (;;)
{
if WANT_TO_SWITCH
{
break;
}
}
// Loop B
for (;;)
{
if WANT_TO_SWITCH
{
break;
}
}
}
答案 2 :(得分:5)
使用break;
打破循环并将控制权传递到其右括号之外。例如
for(;;) {
if( whatever ) {
break;
}
}
//break gets you here
答案 3 :(得分: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是为了防止危险的编译器优化而不用作一些互斥保护/原子访问/内存屏障等)
答案 4 :(得分:4)
“break”命令应该做你需要的吗?
答案 5 :(得分:2)
最好的方法是将for
语句更改为:
for (; Sensor2 <= 20;) {
...
或者,您可以将其从for
更改为while
语句:
while (Sensor2 <= 20) {
...
如果这不能满足您的需求,您可以随时使用break
。
答案 6 :(得分:2)
另一种选择可能是使用信号(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);
...
}