Как правильно?

b_calavasov
Offline
Зарегистрирован: 11.01.2019

Нахватавшись много всего и разного из разных мест, никак не могу взять в толк: что правильнее - с точки зрения программирования для Arduino, разумеется - в плане объявления переменных?

uint8_t i;
for (i=0; i<8; i++) {
<некий код>
}

или же

for (uint8_t i=0; i<8; i++) {
<некий код>
}

Т.е. я имею ввиду, для стандартного Arduino IDE какой вариант объявления переменной более правильный - предварительный или непосредственно перед использованием? В чем между ними разница?

b707
Offline
Зарегистрирован: 26.05.2017

разница в области видимости (или чтоб вам было понятнее - в "области действия") переменной i

Во втором случае эта область ограничена только циклом for и после скобки на строке 3 переменная i перестанет существовать, а в первом продолжит  занимать место в памяти

"Как правильнее?" - зависит от того, что вам нужно

 

negavoid
Offline
Зарегистрирован: 09.07.2016

Оба правильные.

uint8_t i = 122;
for (uint8_t i=0; i<8; i++) {
    // <некий код>
}
Serial.println(i);
// 122

 

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

b707 пишет:
разница в области видимости (или чтоб вам было понятнее - в "области действия") переменной i
Чем меньше видимость переменной, тем больше шанс сэкономить память. Это как в астобусе или маршрутке. Чем короче поездки пассажиров, тем больше может заработать водитель на плече.  И обратно перевозка "кирпичей" снижает зароботок. "Кирпич" пассажир севший в начале маршрута и слезший в конце. Это глобальные переменные , объявляемые до setup()  

b_calavasov
Offline
Зарегистрирован: 11.01.2019

Спасибо ответившим! Вы развеяли мои сомнения.

Тогда, с вашего позволения, следующий вопрос. Как правильнее сделать?

Вариант А:

#define NUM 8

struct Alpha {    
  uint8_t pos;
  uint8_t vol;
};

Alpha * Chain = new Alpha [NUM];

Вариант В:

#define NUM 8

typedef struct {    
  uint8_t pos;
  uint8_t vol;
} alpha_t;

alpha_t Chain[NUM];

В чем разница при таких способах объявления массива?

asam
asam аватар
Offline
Зарегистрирован: 12.12.2018

b_calavasov пишет:

В чем разница при таких способах объявления массива?

Если объявления глобальны (вне функции)  в варианте А память выделяется динамически, в процессе выполнения программы и может быть потом освобождена. А в варианте Б навсегда.

Если внутри функции. То вариант А отрабатывает так же, но остается зарезвированной и после выхода из фунции. А в варианте Б удаляется из памяти (стека) по выходу из функции.

А вообще, возьмите учебник по С/С++, там все это расписано.