public:
//Screen& operator=(const Screen&) = delete;
virtual void setup_init(lv_ui *ui) const = 0;
virtual void events_init(lv_ui *ui) const = 0;
virtual void event_cb(lv_event_t * event) const = 0;
void load(lv_ui *ui, Screen * scr_ptr = NULL) const;
Screen(lv_obj_t **iscr, setup_func_t isetup) : scr{iscr}, setup_scr{isetup}
{}
private:
lv_obj_t **scr; // guider_ui - *screen
const setup_func_t setup_scr;
inline static const Screen *cur_scr;
};
от него наследую и определяю дочерние классы
ScreenMain scr_main(&guider_ui.main, setup_scr_main);
Screen2 scr_2(&guider_ui.screen_2, setup_scr_screen_2);
Screen3 scr_3(&guider_ui.screen_3, setup_scr_screen_3);
Screen4 scr_4(&guider_ui.screen_4, setup_scr_screen_4);
в них ничего интересного, вызываются функции lvgl
А вот в Screen::load происходит непонятное.
Код:
void Screen::load(lv_ui *ui, Screen * scr_ptr) const {
Screen const *scr = ( scr_ptr == NULL ) ? this : (Screen *)scr_ptr;
scr->setup_scr(ui); <<<
scr->events_init(ui);
scr->setup_init(ui);
lv_scr_load( *scr->scr );
const Screen *old_scr = cur_scr;
if (old_scr != NULL){
lv_obj_clean( *old_scr->scr );
lv_obj_del( *old_scr->scr );
}
cur_scr = scr;
}
при переключении на scr_main и scr_2 все нормально.
а вот 3 и 4 - пытается вызвать функцию из ОЗУ. При этом если смотреть .setup_scr в памяти - указывает правильно.
С++17
ЧЯДНТ?
C++17
Это был ответ на вопрос "ЧЯДНТ?"
аа.. а что с ним не так? plain C only?
По крайней мере в нем вотладчике можно посмотреть,что не так
load не виртуальный
Да я и так вижу что не так - в r3 загружается адрес 0x2000xxx и потом blx r3, тогда как нужно грузить 0x800xxx
в двух случаях работает нормально, а в других - нет? откуда такая избирательность?
и при приведении к базовому классу, при наличии иерархии наследования и виртуальных методов используйте dynamic_cast
попробую, конечно. но почему тогда для scr_main и scr_2 работает правильно, а вот для 3 и 4 - нет?
но это ведь про доступ к данным из дочернего класса. правильно? а у меня в дочерних классах данных нет - только определение методов и конструктор class Screen2 : public Screen{ public: virtual void setup_init(lv_ui *ui) const override; virtual void events_init(lv_ui *ui) const override; virtual void event_cb(lv_event_t * event) const override; Screen2(lv_obj_t **iscr, setup_func_t isetup) : Screen(iscr, isetup) {} };
https://en.cppreference.com/w/cpp/language/dynamic_cast
И надо взять за правило, если в классе появляется хоть одна виртуальная функция, то в классе должен быть виртуальный деструктор
Это я знаю, но здесь объекты не уничтожаются.
И протчая, и протчая, и протчая. А потом захотим загрузки гуя в три секунды...
А зачем вообще объект типа Screen * приводить к типу Screen * ? :)
от переделки осталось, изначально там инт был и обрабатывалось иначе.
Обсуждают сегодня