189 похожих чатов

Нид хелп. Уже всю голову сломал. Есть абстрактный класс Код: class Screen{

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
ЧЯДНТ?

17 ответов

24 просмотра

C++17

cume-C Автор вопроса
cume C
screenshot да

Это был ответ на вопрос "ЧЯДНТ?"

cume-C Автор вопроса
Igor Zafievsky
Это был ответ на вопрос "ЧЯДНТ?"

аа.. а что с ним не так? plain C only?

cume C
аа.. а что с ним не так? plain C only?

По крайней мере в нем вотладчике можно посмотреть,что не так

load не виртуальный

cume-C Автор вопроса
Igor Zafievsky
По крайней мере в нем вотладчике можно посмотреть,...

Да я и так вижу что не так - в r3 загружается адрес 0x2000xxx и потом blx r3, тогда как нужно грузить 0x800xxx

cume-C Автор вопроса
Konstantin Grudnev
load не виртуальный

в двух случаях работает нормально, а в других - нет? откуда такая избирательность?

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

cume-C Автор вопроса
Konstantin Grudnev
и при приведении к базовому классу, при наличии ие...

попробую, конечно. но почему тогда для scr_main и scr_2 работает правильно, а вот для 3 и 4 - нет?

cume-C Автор вопроса
Konstantin Grudnev
и при приведении к базовому классу, при наличии ие...

но это ведь про доступ к данным из дочернего класса. правильно? а у меня в дочерних классах данных нет - только определение методов и конструктор 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) {} };

cume C
но это ведь про доступ к данным из дочернего класс...

И надо взять за правило, если в классе появляется хоть одна виртуальная функция, то в классе должен быть виртуальный деструктор

cume-C Автор вопроса
Konstantin Grudnev
И надо взять за правило, если в классе появляется ...

Это я знаю, но здесь объекты не уничтожаются.

Konstantin Grudnev
И надо взять за правило, если в классе появляется ...

И протчая, и протчая, и протчая. А потом захотим загрузки гуя в три секунды...

Konstantin Grudnev
и при приведении к базовому классу, при наличии ие...

А зачем вообще объект типа Screen * приводить к типу Screen * ? :)

cume-C Автор вопроса
Dima B
А зачем вообще объект типа Screen * приводить к ти...

от переделки осталось, изначально там инт был и обрабатывалось иначе.

Похожие вопросы

Обсуждают сегодня

30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Ребят в СИ можно реализовать ООП?
Николай
33
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
6
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Вот еще странный косяк, подскажите как бороться. Я git clone сделал себе всего embassy и примеры там запускаю. Всё хорошо. Но вот решил в cargo.toml зависимости не как в приме...
Lukutin R2AJP
5
Карта сайта