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 ответов

13 просмотров

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 * приводить к ти...

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

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

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

Всем привет, написал код ниже, но он выдает сегфолт, в чем причина? #include <stdio.h> #include <stdlib.h> #include <string.h> struct product { char *name; float price; };...
buzz базз
75
База данных не поможет. Шифрование не поможет. Какие там ещё варианты? Накидывайте.
КТ315
20
А табстоп это сообщение от окна или от элемента управления?
The Bird of Hermes
18
А как лучше конвертировать физический адрес в виртуальный при маппинге? В случае ядра у меня, например, direct mapping, первые 768МБ я как есть мапплю в higher half, а остальн...
Evg Resh
26
Открыл свой двухкилобайтный экзешник в x32dbg, а тут какая-то хрень. Смущает кнопка "выполнить до пользовательского кода", а что ещё может быть в файле помимо него ?
НѣкъиⰘижєжєиꙁъвьсєсвѣтьноѣсѣтиѥсть•
11
Мне были интересны дишные хаки и я нашёл любопытный способ на форуме через __traits, что-то вроде int delegate(int) fac = (int n) => n == 0 ? 1 : n * __traits(parent, {})(n - ...
Constantin F.
1
Вопрос тем кто смотрит видео и слушает подкасты - как вы потом ищете нужную вам информацию? Вот статью я прочитал, потом могу искать нужную мне часть банальным поиском. Пропус...
Aleksandr Druzhinin
4
Всем привет, подскажите/посоветуйте пожалуйста. Фаердак компоненты, имею одно место где бизнес хочет видеть при открытии формы список всех клиентов, это порядка 30к. Мои дово...
Sasha Sch
14
Ребят, если кто в курсе - скажите, а в загранке такое же засилье маркетплейсов? или там простые сермяжные интернет-магазины живут попроще?
Андрей [aharito] Харитонов
14
Коллеги, доброе утро. Запустил на удаленном хосте приложение (ручками зашел туда по ssh и запустил, не командой удаленно). Создал потом ssh-туннель, и с моей машины приложение...
Δημήτηρ
9
Карта сайта