Вот такая вот есть процедура 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 ) { ................... } С чем это может быть связано? Что повреждает строку?
Ну, проверка-то и не должна срабатывать - с чего? Они же не равны. А порча строки - распашка памяти в том или ином виде.
раньше срабатывала! in_topic это дефайн: Код (C++): #define in_topic "light/in" как это понимать? что-то постороннее переписывает этот кусок памяти?
Может, и срабатывала, только не так. Если в дефайне уже есть кавычки, зачем ещё одни в коде? А вот код надо выкладывать полностью, чтобы людям мозг не трахать. Не что-то, а твой же код. Попытайся выяснить в каком именно месте. У тебя ведь в коде куча операция с памятью и ни одной проверки выделилась ли она. Оно и понятно, "тормоза придумали трусы, а проверки замедляют выполнение кода"
Внутри клиента используется один и тот же буфер для входящих и исходящих сообщений. Если функция callback возвращает значение, или подписка делается из под callback'а, топик и переданное в функцию значение из топика будут перезаписаны. Программа должна создать свою собственную копию значений, если они ещё раз потребуются после вызова функции. Ага, теперь стало понятнее, спасибо.
Добавил в самое начала копирование передаваемых параметров в отдельные строки, чтобы они до конца существования callback никуда не терялись.
Зря Вы так. Я ж писал ему. Сделал бы, пользы было бы на пуд больше. По крайней мере, умел бы это делать. А так ... проблема решена ... до возникновения следующей :-(
Ну следующая проблема возникнет быстро. Вот и будет тренироваться. Я смотрю - ТС применяет советы. Тут даже найдя на каком этапе теряются начальные данные, не читав документации, будешь думать, что библиотека глючная. Вот и еще один совет - внимательно читать описания, там много полезного.