всем здравствуйте столкнулся с проблемой что ардуино выдает ошибку и перезагружается там где по моей логике проблемы быть не должно. подскажите пожалуйста что я делаю не так и как это решить платформа esp8266. компиляция через arduino ide есть такая структура классов struct Base1 { Base1():b1_1_b(0x1F) {} virtual int b1_1_vf() {return 0;} virtual int b1_2_vf() {return 0;} byte b1_1_b; }; struct Base2 { Base2():b2_1_b(0xF1) {} virtual int b2_1_vf() {return 0;} virtual int b2_2_vf() {return 0;} byte b2_1_b; }; struct Derived : Base1, Base2 { Derived():d1_1_b(0xEE) {} virtual int d1_1_vf() {return 0;} virtual int d1_2_vf() {return 0;} byte d1_1_b; }; в памяти объект выглядит так Derived layout: 68 45 20 40 1F FF FF FF 80 45 20 40 F1 EE FF FF соответственно 68 45 20 40 указатель на таблицу для base1 и derived а 80 45 20 40 на таблицу base2 но когда я пытаюсь прочитать память по указателю 68 45 20 40 printMemory(reinterpret_cast(*reinterpret_cast(der)), 1); или даже напрямую uint8_t* mem = reinterpret_cast(0x68452040); printMemory(mem, 1); где printMemory это void printMemory(uint8_t* ptr, size_t length) { for (size_t i = 0; i < length; i++) { // Выводим каждый байт в шестнадцатеричном формате Serial.print(ptr[i], HEX); Serial.print(" "); } Serial.println(); } то ардуино перезагружается с ошибкой: ets Jan 8 2013,rst cause:4, boot mode:(3,6) wdt reset load 0x4010f000, len 3424, room 16 tail 0 chksum 0x2e load 0x3fff20b8, len 40, room 8 tail 0 chksum 0x2b csum 0x2b v00042070 ~ld

Комментарии: 36

  1. Bulochka

    ставлю на проблемы типизации.... но ничего не подскажу)

    • Artem

      Типизация? Я же по байтово вывожу с помощью типа длинной один байт

  2. Artem

    Хоть кто нибудь, я уже месяц пытаюсь решить проблему, а это должно помочь

  3. Alexey

    Веротян опотому что адрес 40 20 45 68

    • Artem

      ? По этому адресу должна находится таблица

      • Alexey

        Читать надо по адресу 0x40204568. Вероятно. В памяти байты расположены не по-человечески

        • Artem

          А ведь ты прав. Сейчас попробую

        • Artem

          хоть ты и прав но в первом случае адрес правильный берется через касты. сейчас ввел правильный адрес но результат тот же

          • Argentina

            А откуда ты взял этот код, если не секрет?

  4. Argentina

    exactly

    • Artem

      ок, и как мне тогда узнать что находится в этом промежутке?

      • Argentina

        лучше будет, если вы напишете, какая ваша исходная задача.

        • Artem

          узнать точную структуру таблицы

          • Argentina

            нет, это не исходная задача. эта задача - производная от XY

            • Artem

              написать dynamic cast но без проверки типов для этого мне нужно знать на сколько смещать this

              • Argentina

                зачем? что вы делаете? абстрактного коня в вакууме ?

                • Artem

                  потому что я занимаюсь ооп

                  • Argentina

                    сейчас только ленивый не занимается ооп ближе к делу. давайте изначальную задачу.

                    • Artem

                      struct VBase { virtual String vb1_1_vf() = 0; virtual String vb1_2_vf() = 0; }; struct Base1 : public virtual VBase { Base1():b1_1_b(0x1F) {} virtual String b1_1_vf() {return "b1_1_vf";} virtual String b1_2_vf() {return "b1_2_vf";} byte b1_1_b; }; struct Base2 : public virtual VBase { Base2():b2_1_b(0xF1) {} struct option { byte b2_o1_1; byte b2_o1_2; }; virtual String b2_1_vf() {return "b2_1_vf";} virtual String b2_2_vf() {return "b2_2_vf";} virtual option* get_option() = 0; virtual void b2_3_vf() {Serial.printf("get_option()->b2_o1_1 - %d\n", get_option()->b2_o1_1);} byte b2_1_b; }; struct Derived : Base1, Base2 { Derived():d1_1_b(0xEE) {} virtual String d1_1_vf() {return "d1_1_vf";} virtual String d1_2_vf() {return "d1_2_vf";} String b1_1_vf() override {return "b1_1_vf_override_d1";} String b2_1_vf() override {return "b2_1_vf_override_d1";} String vb1_1_vf() override {return "vb1_1_vf_override_d1";} String vb1_2_vf() override {return "vb1_2_vf_override_d1";} Base2::option* get_option() override {return &_opt1;} static option _opt1; byte d1_1_b; }; Base2::option Derived::_opt1{0xFF, 0xAA}; Есть такая структура классов. названия к делу не относятся, это для отладки я храню объект типа Derived по указателю типа VBase* у него хочу вызвать метод get_option(), для этого мне надо предварительно привести его к типу Base2

                      • Andrey

                        Нет А хотя да. Нужен даункаст один Но здесь что-то с полиморфизмом накосячено Хорошо бы узнать структуру программы. В идеале даункастов быть не должно.

                        • Artem

                          Так это же основа полиморфизма

                          • Andrey

                            Апкаст основа. Используешь то что надо там где надо, не расшаривая базовый класс. dynamic_cast не работает на ардуинах? Почему вообще надо в виртуальную таблицу лезть?

                            • Artem

                              А как тогда обратиться к конкретным методам которые зависят от выбранного набора реализуемых интерфейсов(в данной структуре это base1 base2) если единственный гарантированный родитель это vbase Там нет rtti а с ним и dynamic cast

                        • Argentina

                          а это нормально, что при описании объекта, делается вызов вообще куда-то за пределы разумного ? (я просто не программист)

Не нашли ответ?

Вам также может быть интересно