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