Помогите понять ошибку в цикле for
- Войдите на сайт для отправки комментариев
Вс, 17/01/2021 - 21:50
Здравствуйте!
Писал функцию для плавного включения/отключения светодиодной ленты и наткнулся на некоторые трудности.
Для начала сам код:
void doNightLight(bool buttonstate, uint16_t value) { static bool flag = true; if (buttonstate && flag) { for (uint16_t i = 0; i <= value; i++) { analogWrite(pinNightLight, i); delay(25); } flag = !flag; } else if (!buttonstate && !flag) { for (uint16_t i = value; i > 0; --i) // вот не хочет работать условие i = 0, i >= 0; { analogWrite(pinNightLight, i); delay(25); } //analogWrite(pinNightLight, 0); // костыль!!!! но так лента гаснет полностью. flag = !flag; } }
Собственно проблема в том, что лента при таком условии не гаснет полностью. Если в условии указать "i >= 0" то цикл зацикливается. Но при том, лента выключаясь, начинает светиться с максимума (а не от значения value). Сам цикл проверил в отладке, все норм.
Помогите, пожалуйста, понять где я налажал ))
Просто для понимания: использую сенсорную кнопку с фиксацией.
Из каких соображений в первом цикле идёт "i++", а во втором "--i" ?
В чем разница синтаксиса понимаете ?
uint заменить на int, --i на i--, условие цикла изменить на >=0.
Первый плавно включает, второй плавно выключает.
А вообще зачем тебе беззнаковый тип переменной инкремента ?
Спасибо! Все заработало с интом. Но тепер не могу понять, как итератор вышел за пределы значений uint16_t...
Как должен был , так и вышел.
Для uint16_t при декременте, после нуля идёт 65635, что опять же больше нуля.
Беззнаковая величина всегда >=0, поэтому и зацикливается. Используйте знаковые величины для переменных цикла.
Казалось логичным его использование, так как значения должны были обрабатываться беззнаковые.
Беззнаковая величина всегда >=0, поэтому и зацикливается. Используйте знаковые величины для переменных цикла.
Спасибо! Полезная информация )
Можно и беззнаковую конечно, но зачем ?
for (uint16_t i=value;i<=0&&i<=value;i--)
А зачем лишняя проверка?
А зачем лишняя проверка?
Чтоб используя беззнаковый декремент включить 0 в результаты
А зачем использовать беззнаковые величины? Только для того, чтобы потребовались лишние вычисления при организации цикла?
А зачем использовать беззнаковые величины? Только для того, чтобы потребовались лишние вычисления при организации цикла?
Это нужно спросить у ТС'а
Я просто учусь пытаясь практиковать. Я не совсем понял, мою задачу можно решить одним циклом?
olivergreen, делайте двумя, овчинка выделки не стоит.
Нет, ну у ТС'а возникла проблема "почему цикл зацикливается". Соответственно, ошибку можно устранить разными способами, как более естественными, так и более "противоестественными". Лишние вычисления лично я считаю относящимися ко второму варианту.