loop и время жизни переменной в ней
- Войдите на сайт для отправки комментариев
Пт, 13/07/2018 - 08:48
Хочу уточнить правильно ли я понимаю основы. :-)
После выполнения функции setup() вызывается функция loop()
Когда выполнение кода в loop заканчивается, происходит выход из нее и повторный вызов loop.
Меня мучает вопрос. Если я объявил переменную и при выполнении кода (не при объявлении переменой) функции loop присвоил ей заначение то получается при следующем вызове loop память для этой переменной выделяется заново и присвоенное значение теряется?
Пример правильного и неправвильного кода. (про облать видимости переменных я знаю и использую)
Получается правильней запустить бесконечный цикл в loop чем постоянно входить и вываливаться из нее? Не только из-за переменнных а вообще.
// правильное решение с циклом // светодиод мигает void loop() { int i; while(true) { if(i==1) i=0; else i=1; digitalWrite(13, i); delay(1000); } } // не правильно (почему-то горит постоянно :-) void loop() { int i; if(i==1) i=0; else i=1; digitalWrite(13, i); delay(1000); }
1) Можно бесконечный цикл прямо в setup() вызывать.
2) Meжду лупами вызывается еще и системный serialEvent() (вроде так зовется). При бесконечном цикле в сетапе/лупе сэкономите на его проходе.
3) В первом примере первый проход цикла тоже может гореть сразу, просто заметить не успеваете. Так как вы не присваиваете значения переменной до использования, компилятор назначит ей любое удобное ему значение. А может и вообще if() выкинуть во втором примере. Соптимизировать, так сказать.
4) Чтобы значение не терять, сделайте переменную static.
loop - безвыходная ситуация.
Интересная мысль - надо обмозговать
А между setup() и loop() ничего системного не делается? (это в свете первого пункта)
А между setup() и loop() ничего системного не делается? (это в свете первого пункта)
Вместо тысячи слов:
...\Arduino\hardware\arduino\avr\cores\arduino\main.cpp
sva_khv
Как Вам уже советовали, для второго примера, объявите переменную как "static int i".
Вместо тысячи слов:
...\Arduino\hardware\arduino\avr\cores\arduino\main.cpp
Спасибо. Именно то что и хотел узнать. Теперь все ясно.
sva_khv
Как Вам уже советовали, для второго примера, объявите переменную как "static int i".
Спасибо, но мне привычней сделать ее глобальной. Тогда и в setup() начальное значение можно будет задать.
Как я понял serialEventRun(); - это опрос сом порта. Если не выходить из loop() не получим данные приходящие в com порт от компа?
Всё получим, не бойтесь.
Спасибо, но мне привычней сделать ее глобальной.
Отвыкайте от дурных привычек.
Тем более с именем i.
Где-нибудь понадобится цикл, вставите на автомате for (i= ... посинеете ошибку искать.
Спасибо, но мне привычней сделать ее глобальной.
Отвыкайте от дурных привычек.
Тем более с именем i.
Где-нибудь понадобится цикл, вставите на автомате for (i= ... посинеете ошибку искать.
Позно отвыкать, я не начинаю программировать, а заканчиваю. :-)
С именами переменных у меня все нормально, опыт сын ошибок трудных. И через год вспомню для чего переменную ulTimeEkran1 создал. :-)
Хозяин - барин.
Хозяин - барин.
Это точно. А за совет все равно спасибо. :-)
Я вот как-то на автомате пишу for (int i =...
Тут кто к чему привык. Скажем, у меня это обычно "c". :) По сути, получается что loop и так крутится в бесконечном цикле.
Я вот как-то на автомате пишу for (int i =...
Тогда ещё хлещё. Она заэкранирует глобальную i ... заотлаживается ТС. Но, дело его.
Я вот как-то на автомате пишу for (int i =...
Замечание было именно о том что for (int i =... это нормално а вот объявлять глобальную/статичную переменную int i - плохо.
Мож такое тоже бывает, но я плохо себе представляю, как в цикле с таким итератором кому-то может прийти в голову идея пытаться обратиться к другой переменной с таким же имененм.
Мож такое тоже бывает, но я плохо себе представляю, как в цикле с таким итератором кому-то может прийти в голову идея пытаться обратиться к другой переменной с таким же имененм.
Вы не верите в человечество? :)))
Ладно, проехали, если автору удобно иметь глобальную переменную с имененм i - это его головная боль, а не наша с Вами :)))