Условия цикла for
- Войдите на сайт для отправки комментариев
Пт, 30/08/2019 - 11:37
Всем доброго дня.
Во видимому я очень сильно туплю, по этому прошу помощи. Написал программу. И в простецком месте всплыл не понятный мне глюк. Сделал скетч для отладки бага. Баг подтвердился в самом не ожиданном для меня месте.
Работает
for (byte i = 0; i < LogLenght; i++) { //почему то не срабатывает <= Serial.print(String(i, DEC) + ":" + String(LogData[i], DEC) + "; "); } Serial.println("Add to array:" + String(inByte, DEC));
Уходит в бесконечный цикл
for (byte i = 0; i <= LogLenght; i++) Serial.print(String(i, DEC) + ":" + String(LogData[i], DEC) + "; "); } Serial.println("Add to array:" + String(inByte, DEC));
При этом несколькими строками ниже все работает.
(byte i = 0; i <= LogLenght; i++)
Вся программа для отладки
#define LogLenght 15 byte LogData[LogLenght]; String TempStr; void setup () { Serial.begin(9600); Serial.println(F("podval_BT")); TempStr.reserve(50); } void loop () { //Serial.println("Cycle"); delayMicroseconds(900); //обработка команд с компа if (Serial.available() > 0) { TempStr = Serial.readString(); if (TempStr.startsWith("+")) { TempStr = TempStr.substring(1, 20); int Val = TempStr.toInt(); AddToLog(Val); } else if ((TempStr == "log\r\n")) { LogPrint(); } else { TempStr.replace("\n", ""); //удаляем конец строки TempStr.replace("\r", ""); //удаляем конец строки Serial.print(TempStr); Serial.println(":Unknown command"); } TempStr = ""; } }// void loop () void AddToLog(byte inByte) { //сдвигаем и добавляем в массив for (byte i = (LogLenght - 1); i > 0; i--) { //почему то не срабатывает <= LogData[i] = LogData[i - 1]; } LogData[0] = byte(inByte); //просто печатаю массив посмотреть for (byte i = 0; i < LogLenght; i++) { //почему то не срабатывает <= Serial.print(String(i, DEC) + ":" + String(LogData[i], DEC) + "; "); } Serial.println("Add to array:" + String(inByte, DEC)); } void LogPrint() { Serial.println(F("***Log***(40-80%)")); for (byte i = 0; i <= LogLenght - 1; i++) { //а вот здесь работает int dt = LogData[i] - LogData[i + 1]; //псевдографик в диапазон 40-80 byte LowTick = (constrain(LogData[i], 40 , 80) - 40) / 2; for (byte n = 0; n < LowTick; n++) { Serial.print("."); } Serial.print("|"); for (byte n = LowTick + 1; n <= 20; n++) { Serial.print("."); } Serial.println(" " + String(i, DEC) + ":" + LogData[i] + " dt" + dt); } }
То ли туплю сильно. То ли лыжи летом не едут.
в обоих случаях где "не срабатывает" - выход за границы массива, начните с исправления этого, а дальше посмотрим
Действительно выход за диапазон, туплю. но при этом глюк идёт в преобразовании стринг:
Не работает
Работает
Но таки да, выход за диапазон тут есть, не прав.
Действительно выход за диапазон, туплю. но при этом глюк идёт в преобразовании стринг:
ну значит внутри Serial.print строки преобразовывать нельзя, используйте второй вариант. У меня было подозрение на эту тему, но писать не стал, так как выход за пределы очевидно более грубая ошибка. А со Стринг я вообще не работаю в ардуино
Как говорится "Будь аккуратнее в стрингах".
Ну кстати преобразовывание использовать можно. Все работает если не выходить за диапазон массива.
ну значит внутри Serial.print строки преобразовывать нельзя
Почему нельзя, можно. Только память распахивать выходом за границы не надо, Вы совершенно правы.