Пока цикл в заявлении case (C++)

Кто-нибудь может помочь мне решить, я думаю, что тривиальная проблема для тех, кто знает, что C довольно хорошо. У меня есть часть кода, но label_start_menu: не работает для меня. То, что я хочу достичь, возвращается к умолчанию: теперь, если, например, 3 == 3, в то время как цикл работает бесконечно и невозможно вернуться к умолчанию:

switch (counter1) {

 case 1:

 menu_clock();
 delay(2000);

 while(true){

 Serial.println("loop1");
 Serial.println("loop1");
 Serial.println("loop1");

 if(3 == 3)
 {
 break;
 goto label_start_menu;
 } 
 }
 break;

 case 2: 

 menu_media();
 delay(2000);
 break;

 default:
label_start_menu:
 menu_start();
 break;
 }
}

Спасибо, ojdas

4 ответа

Я не уверен, что вы пытаетесь сделать с вашим циклом while, но у вас есть свой break; перед вашим goto label_start_menu; выражение, поэтому оно никогда не будет достигнуто.

Более полный ответ: в первую очередь нет необходимости в goto. Вы уже вызываете другую функцию. Перепишите все это так:

switch (counter1)
{
case 1:
 menu_clock();
 delay(2000);
 Serial.println("loop1");
 Serial.println("loop1");
 Serial.println("loop1");
 menu_start();
 break;

case 2: 
 menu_media();
 delay(2000);
 break;

default:
 menu_start();
 break;
}


if(3 == 3)
 {
 break;
 goto label_start_menu;
 }

goto никогда не будет выполнено, поскольку break выражение будет вырваться из вашей циклы прямо там.

Моим советом было бы избавиться от goto и просто вызвать menu_start() в инструкции if, а затем сломать вместо использования goto.


Я собираюсь ответить @40two, потому что он точно попадает в гвоздь об использовании goto (помимо других ошибок, поступающих одинаково (без разумных условий прерывания цикла)).

@40two: XKCD - настоящий хороший источник для понимания, так как вы можете прочитать его!


перерыв должен быть последним.

также, зачем ставить его в петлю? это бесконечный цикл. Просто позвоните ему, а затем goto label_start_menu; разрыв, goto label_start_menu; вас из переключателя и не продолжите, поэтому убедитесь, что вы все сделали до того, как goto label_start_menu;, так что поставьте goto label_start_menu; перед перерывом и удалить оператор if, а другой - под ним.

если вы хотите его зациклить, тогда есть другие методы цикла, которые вы можете использовать.. google отлично справляется с этим!

licensed under cc by-sa 3.0 with attribution.