Здравствуйте, - сегодня первый раз применил GO-TO, отличная инструкция! Использовал для хождения по меню дисплея. P.S.
Да, есть такое. Но старшие товарищи мне очень рекомендовали ее забыть, когда вникал в Си еще в 1987г., после фортрана. Очень сильно теряется читаемость исходного кода. Забыл, не применял..., и не жалею Нет кода, который нельзя написать без GOTO.
А мне нравится, может это свежий взгляд на забытое. Не слов ловителем должно быть человек, а истины применителем.
Хорошо, как её использовал - вхожу в меню - энкодером пробегаюсь по трем пунктам - на этой же скажем странице - кнопкой энкодера лезу в подменю и набираю значение - далее кнопкой выхожу из подменю и тут оператором GO-TO возвращаюсь. Очень удобно пользоваться этими метками.
Есть еще оператор Код (C++): brake; Позволяет вывалиться из: Код (C++): for(;;) do {} while() while() switch() Обычно этого достаточно. Или Код (C++): continue; в циклах, кроме Код (C++): switch() goto считается "плохим стилем" в программировании на Си.
Код (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 } } } Пусть будет в секции сеттап - не знаю правда где такое извращение может потребоваться... но вдруг
Код (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-м цикле } } а еще лучше проверку стопа делать до входа в циклы))
Ну вот, как раз хороший пример. У Вас два 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); }
Вообще мне кажется у goto есть один главный недостаток - нельзя вперед прыгать. (или я ошибаюсь?) Это и делает его практически бесполезным для практического применения.
Код (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: } Почему тогда такой код не компилируется ?
А такой: Код (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: ; }
торможу че то.... вот кстати пример с 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 ... я то думал че он у меня не работает....