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

NLe*_*Led 10 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);

    }
Run Code Online (Sandbox Code Playgroud)

我想补充一下:

如果Sensor2返回一个读数(例如Sensor2 > 20),那么我想打破循环并转到另一个无限for循环来开始一个新函数.

Lih*_*ihO 28

如果您正在寻找"在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;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

在某个地方,你只需要打电话:

myMagicLoop();
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助.


Joe*_*Joe 8

这将在循环A和循环B之间切换.

for (;;)
{
    // Loop  A
    for (;;)
    {
        if WANT_TO_SWITCH
        {
            break;
        }

    }

    // Loop  B
    for (;;)
    {

        if WANT_TO_SWITCH
        {
            break;
        }

    }
}
Run Code Online (Sandbox Code Playgroud)


sha*_*oth 5

break;用来打破一个循环并将控制权传递到它的右大括号之外.例如

for(;;) {
   if( whatever ) {
      break;
   }
}
//break gets you here
Run Code Online (Sandbox Code Playgroud)


Lun*_*din 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;
}
Run Code Online (Sandbox Code Playgroud)

(在对volatile变量发表评论之前,注意volatile可以防止危险的编译器优化,而不用作某些互斥保护/原子访问/内存屏障等。)