Оператор for удобен, если требуется повторить какие-либо действия определенное число раз. Но иногда число повторений неизвестно, хотя известно условие завершения цикла (например, при решении уравнения методом последовательных приближений). В этом случае можно использовать оператор цикла по условию while.
Шаблон этого оператора следующий:
while (условие) [тело цикла];
Здесь условие — логическое выражение, истинное значение которого является условием продолжения цикла, тело цикла — это либо один оператор, либо ограниченная фигурными скобками последовательность операторов.
Важная особенность while в том, что если к моменту его начала условие ложно -тело цикла не выполнится ни разу.
Пример операторов while:
while (PORT == 2 ) sum++;
Первый пример демонстрирует бесконечный цикл, т.к. ненулевое значение равносильно истинному логическому выражению. Второй пример опрашивает значение переменной PORT и ведет подсчет в переменной sum числа таких опросов до тех пор, пока значение переменной равно двум (1) .
Java — цикл while, оператор break, отличия while от for, бесконечный цикл
По сравнению с оператором for, цикл while допускает значительно меньше вариантов «оформления». Очевидно, что цикл for вполне в состоянии заменить цикл while:
// эквивалент бесконечного цикла
// эквивалент опроса и подсчета числа этих опросов
for (; PORT == 2 ; sum++);
Тем не менее, рекомендуется использовать while там, где это оправдано логикой алгоритма, это позволит улучшить «читабельность» программы.
- То, каким образом значение переменной PORT может измениться — не рассматривается в данном контексте, предполагается пока, что все-таки такое изменение возможно.
Источник: radio-hobby.org
Программирование микроконтроллера — программа не завершается для цикла
У меня есть простая схема PIC16F18877 на моей макетной плате, и я успешно добился того, чтобы светодиод мигал в бесконечном цикле while . Я попытался поместить тот же код в цикл for , который должен выполняться только 5 раз, но светодиод продолжает мигать.
Мой код (MPLAB с компилятором XC8):
#include #define _XTAL_FREQ 8000000 int main() < TRISD1 = 0; for (int i = 0; i < 5; i++) < RD1 = 1; __delay_ms(500); RD1 = 0; __delay_ms(500); >return 0; >
Jake Rieger 23 Апр 2017 в 20:29
3 ответа
Я попытался добавить цикл while после цикла for, и произошло что-то странное. Оказалось, что он одновременно выполняет цикл for и while. Индикатор будет нормально мигать, а затем мигать очень быстро, почти как заикание, а затем нормально мигать и т. Д., Но он никогда не переставал мигать
Проверьте сторожевой таймер. Если он установлен, микроконтроллер просто перезагружается после установленного количества тактов и запускает код снова и снова. Вы можете использовать CLRWDT () для сброса сторожевого таймера или просто выключить WDT. Я настоятельно рекомендую выполнить следующие действия, чтобы убедиться, что микроконтроллер работает должным образом:
22 Цикл while. Инструкции break, continue, else
- Проверьте биты конфигурации PIC, правильно ли они настроены? См. Документацию в папке программы микрочипа / docs / Chips
- Убедитесь, что генератор настроен правильно.
- Прочтите техническое описание и убедитесь, что порты настроены правильно, особенно аналоговые порты, использующие регистры выбора аналогов.
(моя репутация недостаточно высока, чтобы давать комментарии, извините за это.)
imqqmi 1 Май 2017 в 11:43
Вы не работаете в операционной системе, можете ли вы показать нам разборку, чтобы показать вызов main и то, к чему он возвращается? Или что, если вы поместите бесконечный цикл перед основным завершением (while (1) continue;), тогда вы получите 5 миганий?
old_timer 24 Апр 2017 в 00:40
Куда вы ожидаете скачка ЦП при возврате из main ? Или, скорее, что вы ожидаете от него, если вы не говорите ему, что делать? На настольном компьютере программа обычно возвращается в ОС — на встроенной системе ее нет.
Скорее всего, возврат от main вернется к коду запуска и, в конечном итоге («случайно» или намеренно) к вектору сброса, запустив вашу программу с самого начала.
Если вы хотите, чтобы MCU на самом деле «останавливался», «ничего не делал», вам нужно принудительно запустить его в бесконечный цикл вместо return . Однако это не общий подход к MCU.
tofro 23 Апр 2017 в 20:35
Источник: question-it.com
Цикл for Ардуино и цикл while Ардуино
Рассмотрим, как работают операторы циклов for, while и do while в Arduino IDE, как правильно использовать циклы в скетчах и каких ошибок следует избегать. На простых примерах продемонстрируем, как можно остановить цикл или перейти из одного цикла в другой. Для того, чтобы разобраться в правильности написания циклов, прежде всего, следует изучить виды и свойства алгоритмов в робототехнике.
Как работают циклы в Arduino IDE
Любой цикл в C++ и языке программирования Ардуино представляет собой действие, которое повторяется множество или бесконечное количество раз. Ни одна программа для микроконтроллера Ардуино не обходится без цикла, например, void loop вызывается в бесконечном цикле. Операторы циклов бывают трех видов: for, while и do while — остановимся на каждом операторе, рассмотрим, как они работают на примерах.
Принцип работы for и while можно объяснить на следующих простых примерах. Цикл for выполняется конечное количество раз (указывается в условии оператора) его используют, когда в программе, например, требуется несколько раз моргнуть светодиодом. Цикл while может выполняться бесконечно, например, когда светодиод на Ардуино будет мигать до тех пор, пока не изменятся данные с датчика.
Описание цикла for Ардуино с примером
Для этого занятия потребуется:
- Arduino Uno / Arduino Nano / Arduino Mega
- светодиод и резистор;
- макетная плата;
- провода «папа-папа».
Конструкция for Arduino задается следующим образом:
for (инициализация; условие; изменение)< // команды, которые будут повторяться >
Цикл for используется для повторения определенных команд, заключенных в фигурных скобках. Данный цикл подходит для выполнения любых повторяющихся действий.
При инициализации создается переменная и присваивается начальное значение.
В условии записывается значение переменной при которой будет выполняться цикл.
В изменении указывается, как будет изменяться переменная при каждом шаге цикла.
for (byte i=0; idigitalWrite(13, HIGH); delay(500); digitalWrite(13, LOW); delay(500); >
Шаг переменной (изменение) может быть любым. Если необходимо увеличивать переменную сразу на две единицы, то изменение счетчика следует записать так: i=i+2. Цикл for может использоваться внутри процедуры void setup, например, для указания режима работы сразу нескольким пинам. А также в процедуре void loop, например, в программе для последовательного включения светодиодов на Arduino.
Описание цикла while Ардуино с примером
Конструкция while Arduino задается следующим образом:
while (условие)< // команды, которые будут повторяться >
Цикл while будет выполняться непрерывно и бесконечно, пока условие в круглых скобках является истиной. Выход из цикла будет достигнут, когда изменится переменная в условии while, поэтому что-то должно изменять ее значение. Изменение переменной может происходить в программном коде внутри цикла или при считывания значений с любого датчика, например, с ультразвукового дальномера HC-SR04 .
byte i=0; // необходимо создать переменную до цикла while (i<5)< // цикл выполняется, пока i меньше 5 digitalWrite(13, HIGH); delay(500); digitalWrite(13, LOW); delay(500); i++; // изменение переменной >
При использовании функции while, переменную необходимо создавать до начала цикла. В примере скетча светодиод моргнет пять раз, прежде чем закончится цикл. Если не изменять переменную внутри фигурных скобок i++, то цикл будет повторяться бесконечно. Второй способ сделать выход из цикла while Arduino Uno, это считывать данные с датчика и использовать условный оператор if для изменения переменной.
Еще один цикл, который можно использовать в Arduino IDE — это цикл с постусловием do … while. При использовании данной конструкции команды в цикле выполнятся минимум один раз, вне зависимости от условия, так как условие проверяется уже после выполнения тела цикла. В следующем примере кода, светодиод включится независимо от показаний датчика и только потом выполнится проверка постусловия.
int water; // создаем переменную до цикла do < digitalWrite(13, HIGH); water = analogRead(AO); > while (water<5) // выполняем проверку датчика digitalWrite(13, LOW);
Как выйти из цикла while или for
В том случае, если необходимо выйти из тела цикла, независимо от обозначенных условий, используется оператор break или goto. Оператор break позволяет выйти из цикла и программа продолжит выполнение следующих команд. Оператор goto позволяет не только выйти из цикла, но и продолжить выполнение программы с нужного места по метке, например, можно перейти в другой цикл в Arduino.
Источник: xn--18-6kcdusowgbt1a4b.xn--p1ai