переменная non asssign, использующая for in loop (), может запомнить последнее значение. что здесь происходит?
Я изменяю этот код от моего друга, и это выглядит странно.
void setup() {
Serial.begin(115200);
Serial.println("reset");
}
void loop() {
for (int d; d <= 32767; d++) {
Serial.println(d);
delay (1000);
}
}
по какой-то причине, когда вы нажимаете reset, переменная будет продолжать отсчет от последнего значения, как показано на рисунке.
это не произойдет, когда вы поместите эти блоки в setup()
Я знаю, что не очень хорошая идея использовать varible in for loop без присвоенного значения, но я полагал, что у него должна быть интересная причина для этого. Для моей гипотезы значение переменной просто выделяют с тем же адресом в памяти. когда этот код запускается в setup (), каким-то образом комплисер обнаруживает эту ситуацию и присваивает 0 в качестве начального значения. но когда в loop() некоторые, как компилятор не присваивает новое значение адресу памяти, и он получает старое значение из последнего времени, когда программа была запущена перед сбросом. Мне все еще нужны дальнейшие объяснения.
@M lab, 👍0
Обсуждение1 ответ
Я думаю, что вы пропустили предупреждение компилятора (я тоже!) - Обратите внимание, что вы используете 'd' неинициализированный. При каждом повторном входе в функцию loop() стек loop () будет находиться в одном и том же месте в памяти. For-loop не инициализирует 'd', но загрузчик сделал ноль ОЗУ для вашего первого запуска. "d" занимает одно и то же место в памяти на каждой записи в loop(), поэтому старое значение (непосредственно перед сбросом) все еще на месте. Поскольку for-loop не повторно инициализировал его... :)
Исправление:
for (int d=0; d <= 32767; d++) {
Обновление:
Напрашивается вопрос: почему ваш запуск не удался, как ожидалось, в то время как мой запуск, казалось, выполнялся нормально? Я предполагаю, что разные загрузчики, один из которых делает это, а другой-нет, инициализируют SRAM при сбросе, который не приводит к загрузке.
Вау, никогда не думал, что это была проблема с прошивкой. Мне не нужно исправление, мне нужно объяснение., @M lab
Я не могу подтвердить, что разница между вашими запусками и моими связана с прошивкой, но нет никаких сомнений в том, что " d " использовался без инициализации., @JRobert
старая среда разработки, старая цепочка инструментов AVR, @Juraj
- Как объявить массив переменного размера (глобально)
- Как получить тип данных переменной?
- Преобразование long в массив символов и обратно
- контент» не захватывается
- Получение имени перечисления из экземпляра перечисления
- Некоторые переменные не сохраняют свои значения при выходе из цикла while?
- Как отобразить переменные с плавающей запятой на OLED-дисплее (0,96 дюйма)
- Сохранение файла .txt на SD-карту и чтение данных каждого содержимого в файл txt, а затем сохранение его в переменной
Этот код ведет себя для меня нормально - "d" начинается с 0 при каждом сбросе. Это полный и точный код, который привел пример вывода?, @JRobert
@JRobert, да, я использую Arduino UNO с Arduino 1.1.13, @M lab