Повреждается строка без всякой причины

Тема в разделе "ESP8266, ESP32", создана пользователем admitry, 20 дек 2020.

  1. admitry

    admitry Нуб

    Вот такая вот есть процедура Callback

    Код (C++):
    void callback(char* topic, byte* payload, unsigned int length) {
    Serial.println(topic);
    if( strcmp(topic, "in_topic") == 0 )
      {
      input=0;
     
      digitalWrite(0, LOW);
      delay(100);  
      digitalWrite(0, HIGH);

    String str;
    str = (/*const*/ char*) payload;
    //Serial.println(str);
    String str1 = str.substring(0, length);
    Serial.println(str1);
    client.publish(out_topic, String(str1).c_str(), true);  

    char str2[10];

    str1.toCharArray(str2, (str1.length()+1));    // копируется String в массив str2
    float x = atof(str2);  //  преобразование в float

    client.publish(out_topic, String(x).c_str(), true);  
    Serial.println(str2);
    Serial.println(x);
    current= x*10;
    Serial.println(topic);

    }
    }
     

    название топика выводим на печать
    в начале процедуры выводится корректно
    в конце то же самое название не выводится, вместо него приходит единица, и всё
    так это выглядит в мониторе COM порта:

    То есть одна и та же строка сначала печатается правильно, потом криво
    потому же и проверка назавания топика не выполняется
    Код (C++):
    if( strcmp(topic, "in_topic") == 0 )
      {
    ...................
    }
    С чем это может быть связано? Что повреждает строку?
     
  2. Asper Daffy

    Asper Daffy Иксперд

    Ну, проверка-то и не должна срабатывать - с чего? Они же не равны.

    А порча строки - распашка памяти в том или ином виде.
     
  3. admitry

    admitry Нуб

    раньше срабатывала!
    in_topic это дефайн:

    Код (C++):
    #define in_topic  "light/in"
    как это понимать? что-то постороннее переписывает этот кусок памяти?
     
  4. Asper Daffy

    Asper Daffy Иксперд

    Может, и срабатывала, только не так. Если в дефайне уже есть кавычки, зачем ещё одни в коде?
    А вот код надо выкладывать полностью, чтобы людям мозг не трахать.
    Не что-то, а твой же код. Попытайся выяснить в каком именно месте. У тебя ведь в коде куча операция с памятью и ни одной проверки выделилась ли она. Оно и понятно, "тормоза придумали трусы, а проверки замедляют выполнение кода" :)
     
    b707 и Andrey12 нравится это.
  5. SergeiL

    SergeiL Оракул Модератор

    Потому, что нужно читать документацию читаем последний абзац:
     
  6. admitry

    admitry Нуб

    Внутри клиента используется один и тот же буфер для входящих и исходящих сообщений. Если функция callback возвращает значение, или подписка делается из под callback'а, топик и переданное в функцию значение из топика будут перезаписаны. Программа должна создать свою собственную копию значений, если они ещё раз потребуются после вызова функции.

    Ага, теперь стало понятнее, спасибо.
     
  7. admitry

    admitry Нуб

    Добавил в самое начала копирование передаваемых параметров в отдельные строки, чтобы они до конца существования callback никуда не терялись.
     
  8. Asper Daffy

    Asper Daffy Иксперд

    Зря Вы так.

    Я ж писал ему.
    Сделал бы, пользы было бы на пуд больше. По крайней мере, умел бы это делать. А так ... проблема решена ... до возникновения следующей :-(
     
    SergeiL нравится это.
  9. SergeiL

    SergeiL Оракул Модератор

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