Как разорвать бесконечный цикл for(;;) В C?

у меня есть жизненно важный бесконечный цикл 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), затем я хочу разорвать цикл и перейти к другому бесконечному циклу, чтобы начать новую функцию.

7 ответов


если вы ищете "переключение между 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();

надеюсь, что это помогает.


это переключится между циклом A и циклом B.

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

    }

    // Loop  B
    for (;;)
    {

        if WANT_TO_SWITCH
        {
            break;
        }

    }
}

вы используете break; чтобы разорвать цикл и передать управление за его закрывающую скобку. Например

for(;;) {
   if( whatever ) {
      break;
   }
}
//break gets you here

команда "break" должна делать то, что вам нужно?


в качестве альтернативы вы можете рассмотреть возможность перезаписи этого с помощью подхода, основанного на событиях. Это, конечно, будет зависеть от того, на что способно ваше оборудование, но, по крайней мере, вы должны иметь возможность создавать некоторые события таймера.

тогда код будет выглядеть примерно так:

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 существует для предотвращения опасных оптимизаций компилятора и не служить некоторые предохранитель мьютекса / атомарный барьер ЕТК доступа/памяти.)


лучший способ сделать это-изменить for заявление к чему-то вроде:

for (; Sensor2 <= 20;) {
...

в качестве альтернативы вы можете изменить его с for до while о себе:

while (Sensor2 <= 20) {
...

если это не подходит вашим потребностям, вы всегда можете использовать break вместо.


другим вариантом может быть использование сигналов (SIGUSR1, SIGUSR2) для переключения с одного цикла на другой. Что-то в этом роде:--2-->

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