Не корректно работает код

smyrfavlad
Offline
Зарегистрирован: 09.10.2022

Всем привет, недавно возникла проблема с кодом, не могу найти ошибку, должен работать так что есть 5 светодиодов и одна кнопка, при нажатие на кнопку должен загорится первый светодиод. при следующем нажатии должен загорится второй светодиод, и так до 5 светодиода. Когда загорятся все 5 светд. то при каждом следующем нажатии она должны по очереди выключатся, но код работает не корректно, подскажите что не так)

Вот код:

 

https://arduino.ru/forum/obshchii/vstavka-programmnogo-koda-v-temukommentarii

 

 

 
 
-NMi-
Offline
Зарегистрирован: 20.08.2018

канечный афтомат пагугли.

Green
Offline
Зарегистрирован: 01.10.2015

Код кривой, корявый, вставить не можешь... Бухал что ли? После ДР?
 

#define KEY         2
#define LED1        12
#define LED2        11
#define LED3        10
#define LED4        9
#define LED5        8

#define get_key()   !digitalRead(KEY)
#define KEY_TIME    250


uint8_t led[] = { LED1, LED2, LED3, LED4, LED5 };

void setup() {
  pinMode(KEY, INPUT_PULLUP);
  for (uint8_t i = 0; i < sizeof(led); i++)
    pinMode(led[i], OUTPUT);
}

void loop() {
  if (get_key()) {
    static uint8_t i;
    digitalWrite(led[i], !digitalRead(led[i]);
    if (++i >= sizeof(led))
      i = 0;
    delay(KEY_TIME);
  }
}

Сравнивай.

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

В 22 я бы сделал так:

static uint8_t  i = 0;

 

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

BOOM пишет:

В 22 я бы сделал так:

static uint8_t  i = 0;


это когда писатель и за каждую букву оплачивают?  )))

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

А что, инициализировать ее не надо? И так сойдёт?

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Если чем-то отличным от 0, то - надо.

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

А почему? Что-то не пойму...

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Чего именно не понимаете?

Почему бессмысленно дважды инициализировать одну и ту же переменную одним и тем же значением?

Kakmyc
Offline
Зарегистрирован: 15.01.2018

Если переменная локальная и объявляется внутри функции, то инициализировать обязательно.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

А если не локальная?

v258
v258 аватар
Offline
Зарегистрирован: 25.05.2020

В данном случае локальная

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

BOOM пишет:

А почему? Что-то не пойму...

компилятор проинициализирует

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

v258 пишет:
В данном случае локальная

Да?

А вот распределение памяти говорит иначе.

int a;

void setup() {
  static int b;
  int c;
  Serial.begin(115200);
  Serial.println(a);
  Serial.println(b);
  Serial.println(c);
  Serial.println((uint16_t)&a);
  Serial.println((uint16_t)&b);
  Serial.println((uint16_t)&c);
}

void loop() {
}

Результат:

0
0
-20990
280
278
2298

 

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

smyrfavlad пишет:

должен работать

Кому это он так задолжал?

Если код из #2, то никому он ничего не должен. Разве что Вы будете очень долго кнопку нажатой держать. Он же у Вас спит по четверти секунды и плюёт на кнопку с высокой колокольни. Потом просыпается, глянет как там кнопка и снова спать.

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

BOOM пишет:

А почему? Что-то не пойму...


Статики и глобалы автоматически инициализируются нулем.

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

sadman41 пишет:
BOOM пишет:

А почему? Что-то не пойму...

Статики и глобалы автоматически инициализируются нулем.

Спасибо, добрый человек! Буду знать теперь.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

BOOM пишет:

sadman41 пишет:
BOOM пишет:

А почему? Что-то не пойму...

Статики и глобалы автоматически инициализируются нулем.

Спасибо, добрый человек! Буду знать теперь.


это аппаратные особенности

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

ua6em пишет:

sadman41 пишет:
Статики и глобалы автоматически инициализируются нулем.

это аппаратные особенности

Отнюдь.

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

ua6em пишет:

это аппаратные особенности

Фигвам!

И в Си, кстати, тоже.

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

BOOM пишет:

sadman41 пишет:
Статики и глобалы автоматически инициализируются нулем.

Спасибо, добрый человек! Буду знать теперь.

Аптамуш, статик это тот же глобал, и хранится там же, в глобалах, просто его область видимости ограничена функцией, вернее, блоком {...}, где он обьявлен

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

DetSimen пишет:

Аптамуш, статик это тот же глобал, и хранится там же, в глобалах, просто его область видимости ограничена функцией, вернее, блоком {...}, где он обьявлен

В чем, кстати, каждый при желании может убедиться самостоятельно: https://arduino.ru/forum/programmirovanie/ne-korrektno-rabotaet-kod#comment-668602

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

DetSimen пишет:

BOOM пишет:

sadman41 пишет:
Статики и глобалы автоматически инициализируются нулем.

Спасибо, добрый человек! Буду знать теперь.

Аптамуш, статик это тот же глобал, и хранится там же, в глобалах, просто его область видимости ограничена функцией, вернее, блоком {...}, где он обьявлен

если хранится в том же адресном пространстве кто мешает оттуда достать?

Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018

smyrfavlad пишет:

 но код работает не корректно

Код ВСЕГДА работает так, как написан и ему плевать на познания автора кода о корректности работы кода ...

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

ua6em пишет:

DetSimen пишет:

BOOM пишет:

sadman41 пишет:
Статики и глобалы автоматически инициализируются нулем.

Спасибо, добрый человек! Буду знать теперь.

Аптамуш, статик это тот же глобал, и хранится там же, в глобалах, просто его область видимости ограничена функцией, вернее, блоком {...}, где он обьявлен

если хранится в том же адресном пространстве кто мешает оттуда достать?

Во-первых, и глобальные переменные, и куча, и стек они изначально находятся в одном и том же адресном пространстве.

А во-вторых, никто доставать не мешает. Даже речи о том, что кто-то мешает, не было.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

andriano пишет:

Во-первых, и глобальные переменные, и куча, и стек они изначально находятся в одном и том же адресном пространстве.

А во-вторых, никто доставать не мешает. Даже речи о том, что кто-то мешает, не было.

а в чём тогда разница? что именно создаёт область видимости?
ЗЫ невольно тут вспомнишь про петуха, у него и для поощрения и для наказания один метод...а в чём разница )))

Green
Offline
Зарегистрирован: 01.10.2015

Область видимости создаёт ЯП и строго поддерживает компилятор. Что бы ты не заблудился.)

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

ua6em пишет:

andriano пишет:

Во-первых, и глобальные переменные, и куча, и стек они изначально находятся в одном и том же адресном пространстве.

А во-вторых, никто доставать не мешает. Даже речи о том, что кто-то мешает, не было.

а в чём тогда разница? что именно создаёт область видимости?

Область видимости и адресное пространство это вообще разные вещи (даже относятся к разному: область видимости - к софту, а адресное пространство - к железу), единственное, что их как-то связывает, то, что область видимости содержится внутри адресного пространства (возможно, фрагментарно).

1. Адресное пространство - свойство аппаратное, и является совокупностью всех доступных процессору адресов ячеек или каких-либо их аналогов (например, регистров) по адресу (плоскому или сегментированному). Например, у AVR два адресных пространства: ОЗУ+регистры и flash/программы (либо PROGMEM данные). Т.е. одному и тому же адресу соответствуют два объекта - один в одном адресном пространстве, другой - в другом. У Intel x86 тоже жва адресных пространства: одно для программ и данных, другое - для портов ввода/вывода. Размер этих адресных пространств (длина адреса) различен. А вот у stm32 и других ARM адресное пространство одно, куда входит ОЗУ, ПЗУ, а также поты ввода/вывода. В любом случае это особенность аппаратной архитектуры.

2. Область видимости - особенность языка программирования, в частности Си и Си++. Есть похожие вещи и в других языках программирования, но они могут по-другому называться и иметь иные свойства. В частности, в Ассемблере, насколько я помню, такого понятия как область видимости вообще нет. В Фортране и Паскале видимость переменных определяется существенно отличающимися от области видимости правилами.

kakaxi
Offline
Зарегистрирован: 20.07.2021

Использование локальных переменных при определении требует инициализации, а глобальных переменных - нет.