Jump to content

    

Метценгерштейн

Свой
  • Content Count

    1491
  • Joined

  • Last visited

Community Reputation

0 Обычный

About Метценгерштейн

  • Rank
    Профессионал
  • Birthday 05/07/1978

Контакты

  • Сайт
    http://
  • ICQ
    0

Информация

  • Город
    Петербург

Recent Profile Visitors

5073 profile views
  1. странность с выводом строки char *

    template<typename P> P GetPointer(voffset_t field) { auto field_offset = GetOptionalFieldOffset(field); auto p = data_ + field_offset; return field_offset ? reinterpret_cast<P>(p + ReadScalar<uoffset_t>(p)) : nullptr; } может и да, 4- это что вернуло как значение из таблицы. Но я ведь могу поменять значение. Проверю. смущает что код const char * tst_vers3 = device_firmware->md5_checksum()->c_str(); без проблем отрабатывает и возвращает и корректный адрес указателя и значение- саму строку. вот полностью кусок файла- чтобы была картина более полная struct DeviceFirmware FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { VT_VERSION = 4, VT_TYPE = 6, VT_RELEASE_TIMESTAMP = 8, VT_FIRMWARE = 10, VT_MD5_CHECKSUM = 12, VT_CHUNK_NUMBER = 14, VT_LAST_CHUNK = 16, VT_LAST_TRANSFER = 18 }; const flatbuffers::String *version() const { return GetPointer<const flatbuffers::String *>(VT_VERSION); } flatbuffers::String *mutable_version() { return GetPointer<flatbuffers::String *>(VT_VERSION); } DataSchema::FirmwareType type() const { return static_cast<DataSchema::FirmwareType>(GetField<int8_t>(VT_TYPE, 0)); } bool mutate_type(DataSchema::FirmwareType _type) { return SetField<int8_t>(VT_TYPE, static_cast<int8_t>(_type), 0); } uint32_t release_timestamp() const { return GetField<uint32_t>(VT_RELEASE_TIMESTAMP, 0); } bool mutate_release_timestamp(uint32_t _release_timestamp) { return SetField<uint32_t>(VT_RELEASE_TIMESTAMP, _release_timestamp, 0); } const flatbuffers::Vector<int8_t> *firmware() const { return GetPointer<const flatbuffers::Vector<int8_t> *>(VT_FIRMWARE); } flatbuffers::Vector<int8_t> *mutable_firmware() { return GetPointer<flatbuffers::Vector<int8_t> *>(VT_FIRMWARE); } const flatbuffers::String *md5_checksum() const { return GetPointer<const flatbuffers::String *>(VT_MD5_CHECKSUM); } Я про md5_checksum- там тот же GetPointer этот все равно возврат tst_vers2 = 0x4 хотя 5 было указано. Так что просто совпадение
  2. странность с выводом строки char *

    немного полнее - это структура struct DeviceFirmware FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { VT_VERSION = 4, VT_TYPE = 6, VT_RELEASE_TIMESTAMP = 8, VT_FIRMWARE = 10, VT_MD5_CHECKSUM = 12, VT_CHUNK_NUMBER = 14, VT_LAST_CHUNK = 16, VT_LAST_TRANSFER = 18 }; const flatbuffers::String *version() const { return GetPointer<const flatbuffers::String *>(VT_VERSION); } значит, можно как-то вызвать device_firmware->version() так? так упал проект. Т.е. вернуло что-то опять не то.
  3. странность с выводом строки char *

    static char ms1[1000]; const char *p_ms1 = &ms1[0]; p_ms1 = device_firmware->version()->c_str(); ESP_LOGI(TAG, "az p_ms1 = %p", p_ms1); const добавил- ругалось вывод: az p_ms1 = 0x4 Т.е. ничего не поменялось. По мне- и не должно было. Т.к. оно таким уже приходит к нам сюда.
  4. странность с выводом строки char *

    Тяжелый синтаксис тут. путь следования до device_firmware->version()->c_str() Вот файл с вызовом const flatbuffers::String *version() const { return GetPointer<const flatbuffers::String *>(VT_VERSION); } идем в другой файл struct String : public Vector<char> { const char *c_str() const { return reinterpret_cast<const char *>(Data()); } std::string str() const { return std::string(c_str(), size()); } // clang-format off #ifdef FLATBUFFERS_HAS_STRING_VIEW flatbuffers::string_view string_view() const { return flatbuffers::string_view(c_str(), size()); } #endif // FLATBUFFERS_HAS_STRING_VIEW // clang-format on bool operator<(const String &o) const { return StringLessThan(this->data(), this->size(), o.data(), o.size()); } }; мне это проделать? Не понял
  5. странность с выводом строки char *

    Это? Вангую у ТСа внутри version() и md5_checksum() есть объекты класса CString в локальной памяти (на стеке). И он возвращает указатели на них. От которых потом берёт c_str() Я не очень понял что имелось ввиду
  6. странность с выводом строки char *

    фонарный указатель- это код ошибки? 4 мои? Может c_str() некорректно работает, но соседняя ф-я его корректно обрабатывает же. (1) const char * tst_vers2 = device_firmware->version()->c_str(); (2) const char * tst_vers3 = device_firmware->md5_checksum()->c_str(); Может не в нем дело?
  7. странность с выводом строки char *

    это как? В смысле, труба дело? Это и так понятно. Откуда вылезло?
  8. странность с выводом строки char *

    попробую. Только там матрешка целая. Вот объявил: // Output the data obtained const DataSchema::DeviceFirmware* device_firmware_flatbuffers = DataSchema::GetDeviceFirmware(builder.GetBufferPointer()); ota.handle_firmware_data(device_firmware_flatbuffers); вызвал handle_firmware_data. Вот получил это в handle_firmware_data: ota_error_t OTA::handle_firmware_data(const DataSchema::DeviceFirmware *device_firmware) { ... там уже делаю эти вызовы. Точнее, еще в одну ф-ю передаю тот же объект device_firmware. Но, думаю, не критично это. что можно посмотреть, чтобы это узнать? Код не мой, приехал мне в таком виде))
  9. странность с выводом строки char *

    код ESP_LOGI(TAG, "tst_vers2 = %p", tst_vers2); ESP_LOGI(TAG, "tst_vers3 = %p", tst_vers3); дает вывод: tst_vers2 = 0x4 tst_vers3 = 0x3ffe8d1c очень странно
  10. странность с выводом строки char *

    Linux платформа Считаем, что синтаксис как printf. ESP_LOGI(TAG, "az tst_vers2 = %p", tst_vers2); ESP_LOGI(TAG, "tst_vers2 = %p", tst_vers2); дает вывод tst_vers2 = 0x4 Что странно
  11. странность с выводом строки char *

    я уже делал memcpy в созданный массив. Падает Может я не то делаю. Попрошу строчку кода привести. ESP_LOGI(TAG, "tst_vers2 = %d", (int)tst_vers2); так? лог для вывода адреса
  12. Есть проект на ++, из отладки доступно только логи, типа printf. Получаю в ф-ю объект (device_firmware), где есть две строки по указателю, их и присваиваю новым указателям на char tst_vers2 и tst_vers3 const char * tst_vers2 = device_firmware->version()->c_str(); const char * tst_vers3 = device_firmware->md5_checksum()->c_str(); И тут начинаются странности, если сделать вывод строк, то строка tst_vers3 выводится, или сделать ESP_LOGI(TAG, "tst_vers3 = %d", strlen(tst_vers3)); то тоже выводится кол-во знаков (32), а вот если сделать вывод tst_vers2 , то проект падает. Если с tst_vers2 попробовать вывести strlen- тоже падает. Мне банально не посмотреть что такого в этом tst_vers2 , что проект падает. Что можно придумать?
  13. Timezone GMT0BST,M3.5.0/1,M10.5.0

    может и разжевано, но проще нет варианта, чем парсить это всё. Europe/Belfast получается. И сколько это смещение? Мне не интересно, что за город там, мне надо цифры. Примерно об этом. Если такая строка как у меня, то мне надо знать, сколько прибавить ко времени с сервера.
  14. Timezone GMT0BST,M3.5.0/1,M10.5.0

    Задача простая- получить из сохраненных настроек таймзону, и считать с сервера время. Прибавить к нему. Сама таймзона может быть любая стандартная.
  15. Timezone GMT0BST,M3.5.0/1,M10.5.0

    разумеется, искал. Кроме биллеберды, или что это какой- то годод (Абу- Даби), инфы нет. И что мне этот Абу -Даби дает? Сколько смещение в цифрах? Тут бы хорошо иметь некий массив текстовый, с этими строками, где сразу время брать вторым параметром.