Вызов функции по указателю, расположенному в структуре - C (СИ)
Формулировка задачи:
Господа, помогите с синтаксисом: не могу понять как мне вызвать функцию по указателю, расположенному внутри структуры. Вся эта писанина предназначена для организации легко изменяемого меню.
Листинг программы
- struct chars {
- char string[20];
- };
- struct navig {
- char line_2;
- char line_3;
- void (*left) (char);
- char left_link;
- void (*right)(char);
- char right_link;
- void (*enter)(char);
- char enter_link;
- void (*back)(char);
- char back_link;
- void (*up)(char);
- char up_link;
- void (*down)(char);
- char down_link;
- };
- void Shift_b (char link);
- void Incr_b (char link);
- void Decr_b (char link);
- struct menu {
- struct chars text [3];
- struct navig menu [2];
- char current_scr;
- };
- struct menu PUV = {
- {"Меню_1"},
- {"Меню_1_1"},
- {"Меню_1_2"},
- {0,1, Shift,1, Shift,1, Incr,0, Decr,0, Shift,0, Shift,0},
- {0,2, Shift,0, Shift,0, Incr,0, Decr,0, Shift,1, Shift,1},
- 0
- };
- void Push_button (int key) {
- switch (key) {
- case 0x34: // например так:
- (*PUV->menu[0]->left)(PUV->menu[0]->left_link); // как вызвать функцию по указателю с параметром?
- break;
- case 0x32:
- ...
- }
- // ...продолжение следует
- }
Решение задачи: «Вызов функции по указателю, расположенному в структуре»
textual
Листинг программы
- #include <stdio.h>
- struct chars {
- char string[20];
- };
- struct navig {
- char line_2;
- char line_3;
- void (*left) (char);
- char left_link;
- void (*right)(char);
- char right_link;
- void (*enter)(char);
- char enter_link;
- void (*back)(char);
- char back_link;
- void (*up)(char);
- char up_link;
- void (*down)(char);
- char down_link;
- };
- void Shift(char link)
- {
- printf("shift" "\n");
- }
- void Incr(char link) { }
- void Decr(char link) { }
- void Shift_b (char link);
- void Incr_b (char link);
- void Decr_b (char link);
- struct menu {
- struct chars text [3];
- struct navig menu [2];
- char current_scr;
- };
- /* я тут поправил, чтобы чисто предупреждений не было, хотя было всё нормально */
- struct menu PUV = {
- { {"Меню_1"}, {"Меню_1_1"}, {"Меню_1_2"} },
- { {0,1, Shift,1, Shift,1, Incr,0, Decr,0, Shift,0, Shift,0},
- {0,2, Shift,0, Shift,0, Incr,0, Decr,0, Shift,1, Shift,1} },
- 0
- };
- void Push_button (int key) {
- switch (key) {
- case 0x34:
- PUV.menu[0].left(PUV.menu[0].left_link);
- break;
- }
- }
- int main(void)
- {
- Push_button(0x34);
- return 0;
- }
Объяснение кода листинга программы
- Структура
chars
содержит массив символов и используется для хранения текстовых данных. - Структура
navig
содержит указатели на функции и ссылки на символы, которые используются для навигации по меню. - Функция
Shift
вызывается при нажатии клавишиshift
. - Функции
Incr
иDecr
не имеют реализации и могут быть определены пользователем. - Структура
menu
содержит массив структурchars
для хранения текстовых данных и массив структурnavig
для управления навигацией. - В структуре
menu
текущий экран хранится в переменнойcurrent_scr
. - Структура
menu
инициализируется с использованием массиваPUV
. - Функция
Push_button
вызывается при нажатии клавиши на клавиатуре. - В функции
Push_button
используется операторswitch
для определения действия, которое должно быть выполнено в зависимости от нажатой клавиши. - В данном случае, при нажатии клавиши
0x34
, вызывается функцияleft
из структурыnavig
, которая управляет перемещением влево в меню. - В функции
main
вызывается функцияPush_button
с аргументом0x34
, что вызывает перемещение влево в меню. - Функция
main
завершается с возвращаемым значением0
, что указывает на успешное выполнение программы.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д