Сравнение массивов символов
У меня возникли проблемы со строками в небольшом приложении Arduino. Интересно, почему этот код работает:
mqtt.setServer("192.168.1.42", port);
а в этом коде нет:
IPAddress ip = MDNS.queryHost(...);
mqtt.setServer(ip.toString().c_str(), port);
Даже когда strcmp
возвращает 0 при сравнении обоих:
strcmp(ip.toString().c_str(), "192.168.1.42"); // output = 0 => equality
Я также пробовал другие альтернативы, такие как создание массива char
, но безуспешно:
String ipstr = ip.toString();
char ipchar[ipstr.length() + 1];
ipstr.toCharArray(ipchar, ipstr.length() + 1);
mqtt.setServer(ipchar, port);
Все альтернативы компилируются, но соединение mqtt никогда не устанавливается позже. Должно быть, я упускаю что-то очевидное, потому что это работает, когда я жестко кодирую строку «192.168.1.42».
@Guido, 👍1
Обсуждение1 ответ
Лучший ответ:
PubSubClient::setServer(const char * domain, uint16_t port)
просто сохраняет указатель, а не копирует строку (вероятно, потому что ожидает литерал статической строки).
(Источник)
В вашем случае, когда ip
выходит за пределы области действия, указатель становится недействительным, поэтому он не будет работать.
Просто используйте вместо этого функцию PubSubClient::setServer(IPAddress ip, uint16_t port)
.
(Источник)
Всегда читайте документацию по API, она есть в большинстве библиотек, хотя ее бывает трудно найти. Страницы ReadMe и Wiki на GitHub — хорошее место для начала.
Если этого недостаточно (нередко для проектов с открытым исходным кодом), прочтите заголовочные файлы, которые список всех функций библиотеки.
Если у вас все еще есть сомнения относительно того, что делает функция, обратитесь к фактическим файлам реализации.
- Как разделить входящую строку?
- Как вывести несколько переменных в строке?
- форматирование строк в Arduino для вывода
- Очень простая операция Arduino Uno Serial.readString()
- DateTime в строку
- Как преобразовать строку в массив байтов
- Как отправить строку на мастер с помощью i2c
- Создание форматированной строки (включая числа с плавающей запятой) в Arduino-совместимом C++
Что делает mqtt.setServer? Сохраняет ли он ссылку на указатель или копирует входную строку в свои собственные буферы? Если вы используете константу «192.168.1.42», эта строка будет статической. КОГДА вы используете
ip.toString().c_str()
, когда объектip
освобождается, но.setServer()
все еще имеет ссылку на этотchar*
, он становится недействительным. Где библиотека, которую вы используете?, @Maximilian Gerhardt