переменная 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() некоторые, как компилятор не присваивает новое значение адресу памяти, и он получает старое значение из последнего времени, когда программа была запущена перед сбросом. Мне все еще нужны дальнейшие объяснения.

, 👍0

Обсуждение

Этот код ведет себя для меня нормально - "d" начинается с 0 при каждом сбросе. Это полный и точный код, который привел пример вывода?, @JRobert

@JRobert, да, я использую Arduino UNO с Arduino 1.1.13, @M lab


1 ответ


3

Я думаю, что вы пропустили предупреждение компилятора (я тоже!) - Обратите внимание, что вы используете 'd' неинициализированный. При каждом повторном входе в функцию loop() стек loop () будет находиться в одном и том же месте в памяти. For-loop не инициализирует 'd', но загрузчик сделал ноль ОЗУ для вашего первого запуска. "d" занимает одно и то же место в памяти на каждой записи в loop(), поэтому старое значение (непосредственно перед сбросом) все еще на месте. Поскольку for-loop не повторно инициализировал его... :)

Исправление:

for (int d=0; d <= 32767; d++) {

Обновление:

Напрашивается вопрос: почему ваш запуск не удался, как ожидалось, в то время как мой запуск, казалось, выполнялся нормально? Я предполагаю, что разные загрузчики, один из которых делает это, а другой-нет, инициализируют SRAM при сбросе, который не приводит к загрузке.

,

Вау, никогда не думал, что это была проблема с прошивкой. Мне не нужно исправление, мне нужно объяснение., @M lab

Я не могу подтвердить, что разница между вашими запусками и моими связана с прошивкой, но нет никаких сомнений в том, что " d " использовался без инициализации., @JRobert

старая среда разработки, старая цепочка инструментов AVR, @Juraj