Вызов функции по указателю, расположенному в структуре - 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
, что указывает на успешное выполнение программы.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д