如何打破 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 &gt; 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(;;) 循环?的主要内容,如果未能解决你的问题,请参考以下文章

如何打破批处理文件中的 FOR 循环?

如何打破 Django 模板中的“for循环”

如何打破 Django 模板中的“for循环”

如何打破 Dart 中的嵌套循环

如何打破 Java 中的嵌套循环?

打破节点repl中的无限循环?