如何在C中打破(;;)循环的无限?

时间:2012-02-13 11:25:30

标签: c for-loop sensor infinite

我有一个至关重要的无限循环,允许传感器不断更新其值。但是,当另一个传感器带来新值时,我想打破这个循环。如何从一个无限循环切换到另一个?

当前代码:

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),那么我想打破循环并转到另一个无限循环以开始一个新函数。

7 个答案:

答案 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);
   ...
}