Почему не получается выйти из цикла switch?

qwerty13rus
Offline
Зарегистрирован: 05.12.2018
  if (irrecv.decode(&results))
  {
    switch (results.value) {
      case 3772817503:
      morg:
        if (results.value == 3772817503)
        {

          p = 255;
          analogWrite(5, p);
          delay(100);
          p = 0;
          analogWrite(5, p);
          delay(100);
          p = 255;
          analogWrite(5, p);
          delay(100);
          p = 0;
          analogWrite(5, p);
          delay(100);
          goto morg;
        } else {
          break;
        }
    }

Нужно что бы при изменении значения results.value , срабатывал break;

brokly
brokly аватар
Offline
Зарегистрирован: 08.02.2014

А где он меняется то ? В какой строке ? Может я после текиллы вижу плохо....

sadman41
Offline
Зарегистрирован: 19.10.2016

Если свич усилен ифом, то следовает компенсировать пробивную силу удвоением оператора брэйк.

brokly
brokly аватар
Offline
Зарегистрирован: 08.02.2014

sadman41 пишет:

Если свич усилен ифом, то следовает компенсировать пробивную силу удвоением оператора брэйк.

Покажите пример пожалуйста :)

qwerty13rus
Offline
Зарегистрирован: 05.12.2018

На сколько мне известно, не нужно использовать брейк в ифе

qwerty13rus
Offline
Зарегистрирован: 05.12.2018
#include <IRremote.h>
int p;
unsigned long del;
int pwm;
long v = 0;
IRrecv irrecv(A0);
decode_results results;
void setup() // процедура setup
{
  irrecv.enableIRIn();
  pinMode(A0, INPUT);
  pinMode(5, OUTPUT);
  Serial.begin(9600);
}

void loop()
{
morg:
  if (irrecv.decode(&results))
  {
    switch (results.value) {
      case 3772793023:
        p = 255;
        analogWrite(5, p);
        break;
      case 2024805451:
        p = 0;
        analogWrite(5, p);
        break;
      case 3772833823:
        if (p != 255) {
          p = p + 15;
          analogWrite(5, p);

        } else {
          p = 255;
        }
        break;
      case 3772829743:
        if (p != 0) {
          p = p - 15;
          analogWrite(5, p);

        } else {
          p = 0;
        }
        break;
      /*      case 3772784863:
        label:
              if (p <= 150 )
              {
                p++;
                delay(10);
                analogWrite(5, p);
                goto label;
                if (irrecv.decode(&results))
                {
                  break;
                }
              } else {
                p = p - 1;
                goto label;

              }
      */
      case 3772817503:
        if (results.value == 3772817503)
        {

          p = 255;
          analogWrite(5, p);
          delay(100);
          p = 0;
          analogWrite(5, p);
          delay(100);
          p = 255;
          analogWrite(5, p);
          delay(100);
          p = 0;
          analogWrite(5, p);
          delay(100);
          goto morg;
        } else {
          break;
        }
    }
    Serial.println(results.value);
    irrecv.resume();

  }
}


 

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Похоже ТС - троль . Метка морг . и гото в него ;))

qwerty13rus
Offline
Зарегистрирован: 05.12.2018

все серьезно) наверное я просто туп

brokly
brokly аватар
Offline
Зарегистрирован: 08.02.2014

Я такой мощный код с такими хитрыми приемами не осилю... :(

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Расскажи мне, с когда switch циклом стал?

sadman41
Offline
Зарегистрирован: 19.10.2016

Строка 67 для чего?

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Я хоть выпью за его упокой как оператора выбора.

brokly
brokly аватар
Offline
Зарегистрирован: 08.02.2014

DetSimen пишет:

Расскажи мне, с когда switch циклом стал?

Похоже после того как к нему гото добавили .

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

А. Ну да. 

b707
Offline
Зарегистрирован: 26.05.2017

qwerty13rus пишет:

все серьезно) наверное я просто туп

goto выкиньте.

И лучше вообще никогда не используйте этот оператор (не только тут) - хотя это уже вопрос дискуссионный.

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

b707 пишет:

qwerty13rus пишет:

все серьезно) наверное я просто туп

goto выкиньте.

И лучше вообще никогда не используйте этот оператор (не только тут) - хотя это уже вопрос дискуссионный.

Прошу прощения, но я не был бы столь категоричен. В данном случае - да, но я бы не обобщал.  Каждому апиратору - свою вакансию. 

qwerty13rus
Offline
Зарегистрирован: 05.12.2018

sadman41 пишет:

Строка 67 для чего?

Действительно, не знаю зачем поставил if если и так использую goto, но работать все равно не хочет

b707
Offline
Зарегистрирован: 26.05.2017

DetSimen пишет:

Прошу прощения, но я не был бы столь категоричен.

Ну я ж сразу оговорился - "вопрос дискуссионный" - именно предвидя возражения.

Хотя лично для меня никакой дискуссии в нем нет - за 30 лет знакомства с С-С++ у меня НИ В ОДНОЙ ПРОГРАММЕ нет goto - во всяком случае в моем собственном коде. Всегда можно написать без меток - и меня так учили, что НУЖНО ПИСАТЬ БЕЗ МЕТОК.

Я старый структураст :)

brokly
brokly аватар
Offline
Зарегистрирован: 08.02.2014

brokly пишет:

А где он меняется то ? В какой строке ? Может я после текиллы вижу плохо....

Повторюсь. Это не праздный вопрос.

sadman41
Offline
Зарегистрирован: 19.10.2016

Дак может и goto не к месту?

brokly
brokly аватар
Offline
Зарегистрирован: 08.02.2014

b707 пишет:

ну я ж сразу оговорился - "вопрос дискуссионный" - именно предвидя возражения.

Хотя лично для меня никакой дискусси в нем нет - за 30 лет знакомства с С-С++ у меня НИ В ОДНОЙ ПРОГАММЕ нет goto - во всяком случае в моем собственном коде. Всегда можно написать без меток - и меня так учили, что НУЖНО ПИСАТЬ БЕЗ МЕТОК.

Я старый структураст :)

Ты главное не начни писать на чистом си.... А то бяда....

qwerty13rus
Offline
Зарегистрирован: 05.12.2018

Не подскажете тогда как мне сделать так что бы при определенном значении results.value, циклично выполнялась какая либо часть кода, а при изменении этого значения выходила из цикла?

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Смешно, но goto мне понадобилса только в Ардуино, из-за ацуцтвия исключений, и никогда более :-)

b707
Offline
Зарегистрирован: 26.05.2017

brokly пишет:

Повторюсь. Это не праздный вопрос.

раньше не менялся, теперь меняется :)

в последнем варианте кода ТС переходит по метке выше чтения кода с приемника, так что меняется.

sadman41
Offline
Зарегистрирован: 19.10.2016

b707 пишет:

Хотя лично для меня никакой дискуссии в нем нет - за 30 лет знакомства с С-С++ у меня НИ В ОДНОЙ ПРОГРАММЕ нет goto - во всяком случае в моем собственном коде. Всегда можно написать без меток - и меня так учили, что НУЖНО ПИСАТЬ БЕЗ МЕТОК.

Есть мнение, что учил не Ритчи, который таки ввел данный оператор в структуру языка.

b707
Offline
Зарегистрирован: 26.05.2017

qwerty13rus пишет:

Не подскажете тогда как мне сделать так что бы

А -при определенном значении results.value, циклично выполнялась какая либо часть кода

Б -при изменении этого значения выходила из цикла?

вам не приходит в голову, что две эти части - А и Б - противоречат друг другу?

brokly
brokly аватар
Offline
Зарегистрирован: 08.02.2014

b707 пишет:

раньше не менялся, теперь меняется :)

в последнем варианте кода ТС переходит по метке выше чтения кода с приемника, так что меняется.

Вопрос снят, второй кусок кода не асилил.... 

Я думаю, что GOTO, как прием , получил черную метку в ассемблере, поскольку частенько приводил к засиранию стека, у невнимательных программеров. Ну пуши попами не покрывались :)

sadman41
Offline
Зарегистрирован: 19.10.2016

qwerty13rus пишет:

Не подскажете тогда как мне сделать так что бы при определенном значении results.value, циклично выполнялась какая либо часть кода, а при изменении этого значения выходила из цикла?

Сделай два свича последовательно. В первом по залову кода выставляй значение переменной, во втором - в зависимости от переменной крути фонарик.

qwerty13rus
Offline
Зарегистрирован: 05.12.2018

Так?

#include <IRremote.h>
int p;
int g;
IRrecv irrecv(A0);
decode_results results;
void setup() // процедура setup
{
  irrecv.enableIRIn();
  pinMode(A0, INPUT);
  pinMode(5, OUTPUT);
  Serial.begin(9600);
}

void loop()
{
  if (irrecv.decode(&results))
  {
    switch (results.value) {
      case 3772793023:
        g = 1;
        break;
      case 3772784863:
        g = 2;
        break;
        switch (g) {
          case 1:
            p = 255;
            analogWrite(5, p);
            break;
          case 2:
            p = 255;
            analogWrite(5, p);
            delay(100);
            p = 0;
            analogWrite(5, p);
            delay(100);
            p = 255;
            analogWrite(5, p);
            delay(100);
            p = 0;
            analogWrite(5, p);
            delay(100);
            break;
        }
    }
    Serial.println(results.value);
    irrecv.resume();
  }
}


 

sadman41
Offline
Зарегистрирован: 19.10.2016

Это не последовательно, а вложенно. "Последовательно" начинается после 48-й строки.

qwerty13rus
Offline
Зарегистрирован: 05.12.2018

Спасибо, завелось!

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

qwerty13rus пишет:

Почему не получается выйти из цикла switch?

А войти-то получилось? :)

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

ЕвгенийП пишет:

qwerty13rus пишет:

Почему не получается выйти из цикла switch?

А войти-то получилось? :)

Знаешь, в 90-е ходил шуточный сценарий рекламного ролика финансовой компании:

   В кадре собачки, милые. Начинают заниматься собачьей любовью. Через скромную лирическую вставку - снова собачки и у них беда - склещивание. Кобель скулит и прыгает, не имея возможности "расстаться" с любимой.

 Далее слоган: "Важно не только правильно вложить,  но и вовремя извлечь!" - Финансовая компания "Такая-то" мы сумеем вовремя извлечь  ...ваши средства!

-------------------

Это я к войти и выйти из "цикла switch". ;))))))

strarbit
Offline
Зарегистрирован: 12.06.2016
#define BUTTON1 3772793023
#define BUTTON2 3772784863

void loop() {
  if ( irrecv.decode( &results )) {
    switch ( results.value ) {
      case BUTTON1:
        analogWrite( 5, 255 );
        break;
      case BUTTON2:
        for ( byte i = 0; i < 4; i++ ) {
          if ( !( i % 2 ) ) {
            analogWrite( 5, 255 );
          } else {
            analogWrite( 5, 0 );
          }
          delay( 100 );
        }
        break;
    }
    irrecv.resume();
  }
}