Go-to

Тема в разделе "Флудилка", создана пользователем Рокки1945, 25 авг 2020.

  1. Рокки1945

    Рокки1945 Гуру

    Здравствуйте, - сегодня первый раз применил GO-TO, отличная инструкция! Использовал для хождения по меню дисплея.
    P.S.
     
  2. SergeiL

    SergeiL Оракул Модератор

    Да, есть такое.
    Но старшие товарищи мне очень рекомендовали ее забыть, когда вникал в Си еще в 1987г., после фортрана.
    Очень сильно теряется читаемость исходного кода.
    Забыл, не применял..., и не жалею ;)
    Нет кода, который нельзя написать без GOTO.
     
    Andrey12 и Airbus нравится это.
  3. Рокки1945

    Рокки1945 Гуру

    А мне нравится, может это свежий взгляд на забытое. Не слов ловителем должно быть человек, а истины применителем.
     
  4. Airbus

    Airbus Радиохулиган Модератор

    Работать будет.А смысл?
     
  5. SergeiL

    SergeiL Оракул Модератор

    Да работать то может и будет, но после двух/трех goto понять логику будет сложно. :(
     
    Andrey12 нравится это.
  6. Рокки1945

    Рокки1945 Гуру

    Хорошо, как её использовал - вхожу в меню - энкодером пробегаюсь по трем пунктам - на этой же скажем странице - кнопкой энкодера лезу в подменю и набираю значение - далее кнопкой выхожу из подменю и тут оператором GO-TO возвращаюсь. Очень удобно пользоваться этими метками.
     
  7. SergeiL

    SergeiL Оракул Модератор

    Есть еще оператор
    Код (C++):
    brake;
    Позволяет вывалиться из:
    Код (C++):
    for(;;)
    do {} while()
    while()
    switch()
    Обычно этого достаточно. Или
    Код (C++):
    continue;
    в циклах, кроме
    Код (C++):
    switch()
    goto считается "плохим стилем" в программировании на Си.
     
    Igor68, Daniil и Рокки1945 нравится это.
  8. issaom

    issaom Гуру

    А если цикл вложенный ;)
     
  9. SergeiL

    SergeiL Оракул Модератор

    Так а какая разница?
    Вываливаемся из того, где вызывается ;)
     
  10. issaom

    issaom Гуру

    Не... надо совсем вывалиться из первого который вложен во второй ;-)
     
  11. SergeiL

    SergeiL Оракул Модератор

    Можем обсудить на примере;)
     
  12. issaom

    issaom Гуру

    Код (C++):
    void setup() {
     
      uint8_t STOP = 1;
      label:
      STOP++;

      for (uint8_t j = 0; j < 2; j++) {

        for (char i = 65; i < 67; i++) {
          if (STOP != 5) goto label;  // не выполняем циклы пока STOP не будет равно 5
        }
       
      }

    }
    Пусть будет в секции сеттап - не знаю правда где такое извращение может потребоваться... но вдруг
     
  13. Daniil

    Daniil Гуру

    Код (C++):
    void setup() {
      uint8_t STOP = 1;
      uint8_t flag=0;
      STOP++;

      for (uint8_t j = 0; j < 2; j++) {

        for (char i = 65; i < 67; i++) {
          if (STOP == 5) {flag=1; break;}  // не выполняем циклы пока STOP не будет равно 5
        }
        if (flag==1) {STOP++; flag=0;}//эта строчка последняя в 1-м цикле

      }

    }
    а еще лучше проверку стопа делать до входа в циклы))
     
  14. Asper Daffy

    Asper Daffy Иксперд

    Кода, который нельзя написать с GOTO - тоже нет.
     
    Daniil и Andrey12 нравится это.
  15. SergeiL

    SergeiL Оракул Модератор

    Ну вот, как раз хороший пример.
    У Вас два for, по j и по i.
    А будут ли инкрементироваться значения i и j многие сказать не смогут.
    Реально - нет, но из кода - не понятно.
    А если написать так:
    Код (C++):
    void setup() {
        uint8_t STOP = 1;
        do
        {
            for (uint8_t j = 0; j < 2 && STOP==5; j++)
            {
                for (char i = 65; i < 67 && STOP==5; i++)
                {
                    ;  какой то код, который нужно выполнить при значении STOP == 5
                }
            }
            STOP++;
        } while (STOP<=5);
    }
     
    код получается и быстрее и более читабельным и однозначным.

    UPD: правильней даже так, ближе к исхонику:
    Код (C++):
    void setup() {
        uint8_t STOP = 1;
        do
        {
            STOP++;
            for (uint8_t j = 0; j < 2 && STOP==5; j++)
            {
                for (char i = 65; i < 67 && STOP==5; i++)
                {
                    ;  какой то код, который нужно выполнить при значении STOP == 5
                }
            }
        } while (STOP!=5);
    }
     
     
    Последнее редактирование: 26 авг 2020
    issaom нравится это.
  16. issaom

    issaom Гуру

    Вообще мне кажется у goto есть один главный недостаток - нельзя вперед прыгать. (или я ошибаюсь?) Это и делает его практически бесполезным для практического применения.
     
  17. SergeiL

    SergeiL Оракул Модератор

    Почему нельзя вперед? Можно.
     
  18. issaom

    issaom Гуру

    Код (C++):
    void setup() {
      uint8_t STOP = 1;
      STOP++;
      for (uint8_t j = 0; j < 2; j++) {
        for (char i = 65; i < 67; i++) {
          if (STOP != 5) goto label;  // не выполняем циклы пока STOP не будет равно 5
        }
      }

    label:
    }
    Почему тогда такой код не компилируется ?
     
  19. SergeiL

    SergeiL Оракул Модератор

    А такой:
    Код (C++):
    void setup() {
      uint8_t STOP = 1;
      STOP++;
      for (uint8_t j = 0; j < 2; j++) {
        for (char i = 65; i < 67; i++) {
          if (STOP != 5) goto label;  // не выполняем циклы пока STOP не будет равно 5
        }
      }

    label:
    ;
    }
     
    issaom нравится это.
  20. issaom

    issaom Гуру

    торможу че то....
    вот кстати пример с arduino.cc

    Код (C++):
    for (byte r = 0; r < 255; r++) {
      for (byte g = 255; g > 0; g--) {
        for (byte b = 0; b < 255; b++) {
          if (analogRead(0) > 250) {
            goto bailout;
          }
          // more statements ...
        }
      }
    }

    bailout:
    // more statements ...
    я то думал че он у меня не работает....