loop и время жизни переменной в ней

sva_khv
Offline
Зарегистрирован: 19.12.2016

Хочу уточнить правильно ли я понимаю основы. :-)

После выполнения  функции 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);             
}
sadman41
Offline
Зарегистрирован: 19.10.2016

1) Можно бесконечный цикл прямо в setup() вызывать.

2) Meжду лупами вызывается еще и системный serialEvent() (вроде так зовется). При бесконечном цикле в сетапе/лупе сэкономите на его проходе.

3) В первом примере первый проход цикла тоже может гореть сразу, просто заметить не успеваете. Так как вы не присваиваете значения переменной до использования, компилятор назначит ей любое удобное ему значение. А может и вообще if() выкинуть во втором примере. Соптимизировать, так сказать.

4) Чтобы значение не терять, сделайте переменную static.

trembo
trembo аватар
Offline
Зарегистрирован: 08.04.2011

loop - безвыходная ситуация.

sva_khv
Offline
Зарегистрирован: 19.12.2016

sadman41 пишет:
1) Можно бесконечный цикл прямо в setup() вызывать.

Интересная мысль - надо обмозговать

sadman41 пишет:
2) Meжду лупами вызывается еще и системный serialEvent() (вроде так зовется). При бесконечном цикле в сетапе/лупе сэкономите на его проходе.

А между setup() и loop() ничего системного не делается? (это в свете первого пункта)

 

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

sva_khv пишет:

А между setup() и loop() ничего системного не делается? (это в свете первого пункта)

Вместо тысячи слов:

...\Arduino\hardware\arduino\avr\cores\arduino\main.cpp

int main(void)
{
	init();

	initVariant();

#if defined(USBCON)
	USBDevice.attach();
#endif
	
	setup();
    
	for (;;) {
		loop();
		if (serialEventRun) serialEventRun();
	}
        
	return 0;
}

 

fogary
Offline
Зарегистрирован: 05.03.2016

sva_khv

Как Вам уже советовали, для второго примера, объявите переменную как "static int i".

sva_khv
Offline
Зарегистрирован: 19.12.2016

sadman41 пишет:

Вместо тысячи слов:

...\Arduino\hardware\arduino\avr\cores\arduino\main.cpp

Спасибо. Именно то что и хотел узнать.  Теперь все ясно.

sva_khv
Offline
Зарегистрирован: 19.12.2016

fogary пишет:

sva_khv

Как Вам уже советовали, для второго примера, объявите переменную как "static int i".

Спасибо, но мне привычней сделать ее глобальной. Тогда и в setup()  начальное значение можно будет задать.

sva_khv
Offline
Зарегистрирован: 19.12.2016

Как я понял serialEventRun(); - это опрос сом порта. Если не выходить из loop() не получим данные приходящие в com порт от компа?

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

Всё получим, не бойтесь.

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

sva_khv пишет:

Спасибо, но мне привычней сделать ее глобальной. 

Отвыкайте от дурных привычек.

Тем более с именем i.

Где-нибудь понадобится цикл, вставите на автомате for (i= ... посинеете ошибку искать.

sva_khv
Offline
Зарегистрирован: 19.12.2016

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

sva_khv пишет:

Спасибо, но мне привычней сделать ее глобальной. 

Отвыкайте от дурных привычек.

Тем более с именем i.

Где-нибудь понадобится цикл, вставите на автомате for (i= ... посинеете ошибку искать.

Позно отвыкать, я не начинаю программировать, а заканчиваю. :-)

С именами переменных у меня все нормально, опыт сын ошибок трудных.  И через год вспомню для чего переменную   ulTimeEkran1 создал.   :-)

 

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

Хозяин - барин.

sva_khv
Offline
Зарегистрирован: 19.12.2016

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

Хозяин - барин.

Это точно. А за совет все равно спасибо. :-)

a5021
Offline
Зарегистрирован: 07.07.2013

ЕвгенийП пишет:
Где-нибудь понадобится цикл, вставите на автомате for (i= ... посинеете ошибку искать.

Я вот как-то на автомате пишу for (int i =...

Чечако
Offline
Зарегистрирован: 15.06.2018

Тут кто к чему привык. Скажем, у меня это обычно "c". :) По сути, получается что loop и так крутится в бесконечном цикле.

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

a5021 пишет:

Я вот как-то на автомате пишу for (int i =...

Тогда ещё хлещё. Она заэкранирует глобальную i ... заотлаживается ТС. Но, дело его.

sva_khv
Offline
Зарегистрирован: 19.12.2016

a5021 пишет:

ЕвгенийП пишет:
Где-нибудь понадобится цикл, вставите на автомате for (i= ... посинеете ошибку искать.

Я вот как-то на автомате пишу for (int i =...

Замечание было именно о том что for (int i =...  это нормално а вот объявлять глобальную/статичную переменную int i - плохо.

a5021
Offline
Зарегистрирован: 07.07.2013

ЕвгенийП пишет:
Тогда ещё хлещё. Она заэкранирует глобальную i ... заотлаживается ТС. Но, дело его.

Мож такое тоже бывает, но я плохо себе представляю, как в цикле с таким итератором кому-то может прийти в голову идея пытаться обратиться к другой переменной с таким же имененм.

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

a5021 пишет:

Мож такое тоже бывает, но я плохо себе представляю, как в цикле с таким итератором кому-то может прийти в голову идея пытаться обратиться к другой переменной с таким же имененм.

Вы не верите в человечество? :))) 

Ладно, проехали, если автору удобно иметь глобальную переменную с имененм i - это его головная боль, а не наша с Вами :)))