Условия цикла for

tZZa
Offline
Зарегистрирован: 30.08.2019

Всем доброго дня.

Во видимому я очень сильно туплю, по этому прошу помощи. Написал программу. И в простецком месте всплыл не понятный мне глюк. Сделал скетч для отладки бага. Баг подтвердился в самом не ожиданном для меня месте.

Работает

  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);

  }
}

То ли туплю сильно. То ли лыжи летом не едут.

b707
Offline
Зарегистрирован: 26.05.2017

в обоих случаях где "не срабатывает" -  выход за границы массива, начните с исправления этого, а дальше посмотрим

tZZa
Offline
Зарегистрирован: 30.08.2019

Действительно выход за диапазон, туплю. но при этом глюк идёт в преобразовании стринг:

Не работает

  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(i);
    Serial.print(F(":"));
    Serial.print(LogData[i]);
    Serial.print(F("; "));
  }
  Serial.println("Add to array:" + String(inByte, DEC));

Но таки да, выход за диапазон тут есть, не прав.

 

b707
Offline
Зарегистрирован: 26.05.2017

tZZa пишет:

Действительно выход за диапазон, туплю. но при этом глюк идёт в преобразовании стринг:

 

ну значит внутри Serial.print строки преобразовывать нельзя, используйте второй вариант. У меня было подозрение на эту тему, но писать не стал, так как выход за пределы очевидно более грубая ошибка. А со Стринг я вообще не работаю в ардуино

tZZa
Offline
Зарегистрирован: 30.08.2019

Как говорится "Будь аккуратнее в стрингах".

Ну кстати преобразовывание использовать можно. Все работает если не выходить за диапазон массива.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

b707 пишет:

ну значит внутри Serial.print строки преобразовывать нельзя

Почему нельзя, можно. Только память распахивать выходом за границы не надо, Вы совершенно правы.