Цикл сломан?

loop debugging

Это псевдокод из моего проекта светодиодного куба

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

Почему это?

, 👍0

Обсуждение

Почему вы считаете, что 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


2 ответа


Лучший ответ:

1

Никогда не используйте глобальную переменную для цикла for.

Вы используете ту же переменную в циклах функций for, которые отсчитывают до нуля. Если lp равен нулю, цикл for в loop() заканчивается и начинается новый loop().

,

2

Когда я запустил ваш код, как вы его представили в чате, lp остался на 128. Когда я закомментировал вызов "light_L1()" в "runfor()", lp уменьшился на 1/2 своего значения за шаг, как и ожидалось. Проблема в том, что lp является глобальным и, следовательно, доступен любой другой функции. Одна из ваших нижних функций сбрасывает его.

,

поэтому я убедил автора вопроса опубликовать код, и проблема проявилась сама собой. но вы не объяснили, почему значение подскакивает до 128, @Juraj

Значение меняется, потому что одна из нижних функций изменяет его. Почему я не продолжил отлаживать его до последней детали? 1) Чтобы не красть потенциальный опыт обучения у OP; и 2) потому что это действительно не имеет значения для вопроса: «переменная 'lp' здесь никогда не меняет своего значения и остается 128 Почему это так?». Я указал на общую проблему — изменение глобальной переменной из нескольких мест в коде. Остальное — дело OP, который может попросить дополнительную помощь, если он/она этого хочет., @JRobert