@SleepyBear09
Программист, со словарем

Почему переменная постоянно растет, хотя я нигде не прописывал этого?

У меня в скетче для Arduino nano есть массив будильников Alarms, в одной ячейке которой хранятся часы, минуты и состояние будильника (вкл/выкл). Также чтобы обращаться к конкретной ячейке есть переменная bank. Итак чтобы обратиться к ячейке необходимо выбрать банк, затем спокойно можно редактировать и время и вкл/выкл, но именно в последней ячейке массива значения переменных сходят с ума: постоянно скачут от минимума до максимума, хотя я нигде не прописывал этого, чтобы они самопроизвольно изменялись. Кто знает где моя ошибка?

https://cloud.mail.ru/public/r7s8/KozmzGKqt

P.S код целиком не влезает сюда. Прикрепил ссылку на файл с кодом.
  • Вопрос задан
  • 91 просмотр
Решения вопроса 1
@rPman
ИИ от anthropic - claude.ai:
В коде есть несколько моментов, которые могут приводить к неправильному поведению при работе с последним элементом массива alarms:

Размер массива объявлен как ALARM_COUNT = 20. Это значит, что индексы элементов будут от 0 до 19 включительно. Но в некоторых циклах обработки массива используется условие i <= 30. Это выходит за границы массива и может привести к неопределенному поведению.
При инкременте и декременте номера банка (funkции incrBank, decrBank) не проверяется выход за границы массива. Например, если bank = 20, то после inkBank он станет равен 21, что уже выходит за размер массива.
Не инициализируются значения элементов массива alarms после номера 19. Эти элементы могут содержать случайный "мусор", который и приводит к странному поведению.

Чтобы исправить эти проблемы, я бы порекомендовал:

1. Использовать в циклах условие i < ALARM_COUNT вместо i <= 30
2. Добавить проверку границ при инкременте/декременте номера банка:

void incrBank() {
  if (bank >= ALARM_COUNT-1) { 
    bank = 0;
  } else {
    bank++;
  }
}

void decrBank() {
  if (bank <= 0) {
    bank = ALARM_COUNT-1;  
  } else {
    bank--;
  }  
}

3. Явно инициализировать все элементы массива alarms при старте.

Это должно помочь избежать ошибок при выходе за границы массива и работе с неинициализированными элементами.
Я не проверял твой код, но ответ выглядит достоверным (осторожнее с рекомендацией в примере кода, он там заворачивает твой буфер в кольцо, когда как при ошибке нужно прекращать работу и сигнализировать).

ИИ можно использовать как начало анализа, проверяя каждое из его предположений и задавая наводящие вопросы
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@vanyamba-electronics
Ну вот например у вас здесь опечатка:
alarms[0].hour = 8;alarms[0].minute = 30; alarms[0].start = true;
    alarms[1].hour = 10;alarms[1].minute = 30; alarms[0].start = true;
    alarms[2].hour = 10;alarms[2].minute = 45; alarms[0].start = true;
    alarms[3].hour = 12;alarms[3].minute = 0; alarms[0].start = true;
    alarms[4].hour = 13;alarms[4].minute = 0; alarms[0].start = true;
    alarms[5].hour = 15;alarms[5].minute = 30; alarms[0].start = true;
    alarms[6].hour = 15;alarms[6].minute = 45; alarms[0].start = true;
    alarms[7].hour = 17;alarms[7].minute = 30; alarms[0].start = true;
    alarms[8].hour = 17;alarms[8].minute = 45; alarms[0].start = true;
    alarms[9].hour = 19;alarms[9].minute = 30; alarms[0].start = true;
    alarms[10].hour = 19;alarms[10].minute = 45; alarms[0].start = true;
    alarms[11].hour = 21;alarms[11].minute = 0; alarms[0].start = true;
    alarms[12].hour = 22;alarms[12].minute = 0; alarms[0].start = true;
    alarms[13].hour = 0;alarms[13].minute = 30; alarms[0].start = true;
    alarms[14].hour = 0;alarms[14].minute = 45; alarms[0].start = true;
    alarms[15].hour = 2;alarms[15].minute = 30; alarms[0].start = true;
    alarms[16].hour = 9;alarms[16].minute = 14; alarms[0].start = true;
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы