Войти в систему

Home
    - Создать дневник
    - Написать в дневник
       - Подробный режим

LJ.Rossia.org
    - Новости сайта
    - Общие настройки
    - Sitemap
    - Оплата
    - ljr-fif

Редактировать...
    - Настройки
    - Список друзей
    - Дневник
    - Картинки
    - Пароль
    - Вид дневника

Сообщества

Настроить S2

Помощь
    - Забыли пароль?
    - FAQ
    - Тех. поддержка



Пишет Леонид Каганов ([info]lleokaganov)
@ 2019-12-29 22:22:00


Previous Entry  Add to memories!  Tell a Friend!  Next Entry
Entry tags:программирование, электроника

гребаный C++
это перепост заметки, оригинал находится на моем сайте: https://lleo.me/dnevnik/2019/12/29_1

Слушайте, ну это мистика. В C++ Ардуино есть такой объект String, который в работу не в пример удобнее, чем char. Если нужно String превратить в char, то есть специальная функция .c_str() То есть, вот так работает:

String id = "ESP8266-test";
String login = "lleo";
String password = "h2dtGdGH";
client.connect( id.c_str() , login.c_str() , password.c_str() );

Везде и всегда, где нужно char, это работало. Но лишь в одной из функций одной библиотеки PubSubClient эта херня не работает! А у меня все параметры хранятся именно в String и брать их нужно оттуда.

В примерах у них конечно всё работает:

client.setServer("tailor.cloudmqtt.com",12399);

А вот так — нет:

String URL = "tailor.cloudmqtt.com";
client.setServer(URL.c_str(),12399);

Почему — загадка. В PubSubClient.h
обозначено так:

boolean connect(const char* id, const char* user, const char* pass);
PubSubClient& setServer(const char * domain, uint16_t port);

Вышел из положения, временно нагуглив какую-то дикую конструкцию:

String URL = "tailor.cloudmqtt.com";
unsigned char* buf = new unsigned char[256];
URL.getBytes(buf, 256, 0);
const char *str = (const char*)buf;
client.setServer(str,12399);

Вот только это и сработало. Как думаете, что это, и почему во всех остальных функциях даже той же библиотеки все было норм?

UPD: Мне написали, что, вероятно, моя переменная исчезает раньше, чем функция ее использует... Это не совсем так. Волею судеб переменные этого рода у меня глобальные - они хранятся в объявленной глобально структуре как String имя и String значение. Специальная моя функция Srting CF(String имя) ищет "переменную" с этим именем и возвращает ее значение. То есть, в реальности это не URL.c_str(), а результат функции CF("url").c_str() Вот не пойму: с одной стороны все это реально хранится в глобальном пространстве и деться никуда не может. С другой стороны - это лишь нету результат, который вернула некая функция. И компилятор может его не хранить.



это перепост заметки, оригинал находится на моем сайте: https://lleo.me/dnevnik/2019/12/29_1