всем здравствуйте
столкнулся с проблемой что ардуино выдает ошибку и перезагружается там где по моей логике проблемы быть не должно. подскажите пожалуйста что я делаю не так и как это решить
платформа 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
Комментарии: 36
Bulochka
ставлю на проблемы типизации.... но ничего не подскажу)
Artem
Типизация? Я же по байтово вывожу с помощью типа длинной один байт
Artem
Хоть кто нибудь, я уже месяц пытаюсь решить проблему, а это должно помочь
Alexey
Веротян опотому что адрес 40 20 45 68
Artem
? По этому адресу должна находится таблица
Alexey
Читать надо по адресу 0x40204568. Вероятно. В памяти байты расположены не по-человечески
Artem
А ведь ты прав. Сейчас попробую
Artem
хоть ты и прав но в первом случае адрес правильный берется через касты. сейчас ввел правильный адрес но результат тот же
Argentina
А откуда ты взял этот код, если не секрет?
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
а это нормально, что при описании объекта, делается вызов вообще куда-то за пределы разумного ? (я просто не программист)