Цикл сломан?
Это псевдокод из моего проекта светодиодного куба
void loop(){
//switch( map(constrain(analogRead(pt),10,1020),10,1020,1,4)); - for select pattern
//show(1);
for(lp=128;lp>=1;lp = lp/2){
runfor(1000,lp,1,0,0,0,0);
//Serial.println("HI");
}
}
void runfor(short mills,byte a,byte b,byte c,byte d,byte e,byte f){
timer = millis();
Serial.println(a);
while((millis()-timer)<=mills){
light_L1(a,b);
//light_L2(c,d);
//light_L3(e,f);
}
}
переменная 'lp' здесь никогда не меняет своего значения и остается 128
Почему это?
@A.Shetye, 👍0
Обсуждение2 ответа
Лучший ответ:
Никогда не используйте глобальную переменную для цикла for
.
Вы используете ту же переменную в циклах функций for
, которые отсчитывают до нуля. Если lp
равен нулю, цикл for
в loop()
заканчивается и начинается новый loop()
.
Когда я запустил ваш код, как вы его представили в чате, lp остался на 128. Когда я закомментировал вызов "light_L1()" в "runfor()", lp уменьшился на 1/2 своего значения за шаг, как и ожидалось. Проблема в том, что lp является глобальным и, следовательно, доступен любой другой функции. Одна из ваших нижних функций сбрасывает его.
поэтому я убедил автора вопроса опубликовать код, и проблема проявилась сама собой. но вы не объяснили, почему значение подскакивает до 128, @Juraj
Значение меняется, потому что одна из нижних функций изменяет его. Почему я не продолжил отлаживать его до последней детали? 1) Чтобы не красть потенциальный опыт обучения у OP; и 2) потому что это действительно не имеет значения для вопроса: «переменная 'lp' здесь никогда не меняет своего значения и остается 128 Почему это так?». Я указал на общую проблему — изменение глобальной переменной из нескольких мест в коде. Остальное — дело OP, который может попросить дополнительную помощь, если он/она этого хочет., @JRobert
- Странная проблема с ардуино
- Для loop, похоже, изменяется выполнение pow()
- Как решить проблему «avrdude: stk500_recv(): programmer is not responding»?
- Ошибка "collect2.exe: error: ld returned 1 exit status"
- Мигните светодиодом 5 раз с помощью цикла for
- Поддерживают ли чипы ATMega 328/2560 JTAG-программатор и аппаратный отладчик?
- Proteus - Как отладить недопустимый код операции?
- Мой код кажется крушением поезда
Почему вы считаете, что
lp
не меняется?, @Edgar BonetПротестировано с помощью serial.println, вторая строка в runfor(), @A.Shetye
Я запускаю его. Ничего удивительного. Значение меняется, как и ожидалось., @Juraj
@Juraj Это проблема с моим чипом или IDE?, @A.Shetye
нет. это проблема вашего фрагмента. он делает что-то другое, похожее на эскиз, из которого вы его извлекли и не протестировали, @Juraj
Так, может быть, на это влияет какая-то другая функция?, @A.Shetye
Давайте [продолжим это обсуждение в чате](https://chat.stackexchange.com/rooms/82257/discussion-between-a-shetye-and-juraj)., @A.Shetye