Вызов функции по указателю, расположенному в структуре - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Господа, помогите с синтаксисом: не могу понять как мне вызвать функцию по указателю, расположенному внутри структуры. Вся эта писанина предназначена для организации легко изменяемого меню.
Листинг программы
  1. struct chars {
  2. char string[20];
  3. };
  4. struct navig {
  5. char line_2;
  6. char line_3;
  7. void (*left) (char);
  8. char left_link;
  9. void (*right)(char);
  10. char right_link;
  11. void (*enter)(char);
  12. char enter_link;
  13. void (*back)(char);
  14. char back_link;
  15. void (*up)(char);
  16. char up_link;
  17. void (*down)(char);
  18. char down_link;
  19. };
  20. void Shift_b (char link);
  21. void Incr_b (char link);
  22. void Decr_b (char link);
  23. struct menu {
  24. struct chars text [3];
  25. struct navig menu [2];
  26. char current_scr;
  27. };
  28. struct menu PUV = {
  29. {"Меню_1"},
  30. {"Меню_1_1"},
  31. {"Меню_1_2"},
  32. {0,1, Shift,1, Shift,1, Incr,0, Decr,0, Shift,0, Shift,0},
  33. {0,2, Shift,0, Shift,0, Incr,0, Decr,0, Shift,1, Shift,1},
  34. 0
  35. };
  36.  
  37. void Push_button (int key) {
  38. switch (key) {
  39. case 0x34: // например так:
  40. (*PUV->menu[0]->left)(PUV->menu[0]->left_link); // как вызвать функцию по указателю с параметром?
  41. break;
  42. case 0x32:
  43. ...
  44. }
  45. // ...продолжение следует
  46. }

Решение задачи: «Вызов функции по указателю, расположенному в структуре»

textual
Листинг программы
  1. #include <stdio.h>
  2.  
  3. struct chars {
  4.  char string[20];                                                                                      
  5. };
  6.                                                                                                                                                                                                                                                                                
  7. struct navig {                                                                                  
  8.  char line_2;
  9.  char line_3;
  10.  
  11.  void (*left)   (char);
  12.  char left_link;
  13.  
  14.  void (*right)(char);          
  15.  char right_link;
  16.  
  17.  void (*enter)(char);
  18.  char enter_link;
  19.  
  20.  void (*back)(char);
  21.  char back_link;
  22.  
  23.  void (*up)(char);
  24.  char up_link;
  25.  
  26.  void (*down)(char);                                    
  27.  char down_link;
  28. };
  29.  
  30. void Shift(char link)
  31. {
  32.     printf("shift" "\n");
  33. }
  34.  
  35. void Incr(char link) { }
  36. void Decr(char link) { }
  37.  
  38.  
  39. void Shift_b (char link);
  40. void Incr_b (char link);
  41. void Decr_b (char link);
  42.  
  43.  
  44. struct menu {
  45.         struct  chars text [3];
  46.         struct  navig menu [2];
  47.         char    current_scr;
  48.                                                                                                                                                                                                                                                                        
  49. };
  50.  
  51.  /* я тут поправил, чтобы чисто предупреждений не было, хотя было всё нормально */
  52. struct menu PUV = {
  53.  { {"Меню_1"}, {"Меню_1_1"}, {"Меню_1_2"} },
  54.  { {0,1,  Shift,1,  Shift,1,  Incr,0,  Decr,0,  Shift,0,  Shift,0},
  55.    {0,2,  Shift,0,  Shift,0,  Incr,0,  Decr,0,  Shift,1,  Shift,1} },
  56.  0
  57. };                                                                                                      
  58.  
  59.  
  60. void Push_button (int key) {    
  61.  switch (key) {                                                
  62.   case 0x34:
  63.    PUV.menu[0].left(PUV.menu[0].left_link);
  64.    break;
  65.  }
  66. }
  67.  
  68.  
  69. int main(void)
  70. {
  71.     Push_button(0x34);
  72.     return 0;
  73. }

Объяснение кода листинга программы

  1. Структура chars содержит массив символов и используется для хранения текстовых данных.
  2. Структура navig содержит указатели на функции и ссылки на символы, которые используются для навигации по меню.
  3. Функция Shift вызывается при нажатии клавиши shift.
  4. Функции Incr и Decr не имеют реализации и могут быть определены пользователем.
  5. Структура menu содержит массив структур chars для хранения текстовых данных и массив структур navig для управления навигацией.
  6. В структуре menu текущий экран хранится в переменной current_scr.
  7. Структура menu инициализируется с использованием массива PUV.
  8. Функция Push_button вызывается при нажатии клавиши на клавиатуре.
  9. В функции Push_button используется оператор switch для определения действия, которое должно быть выполнено в зависимости от нажатой клавиши.
  10. В данном случае, при нажатии клавиши 0x34, вызывается функция left из структуры navig, которая управляет перемещением влево в меню.
  11. В функции main вызывается функция Push_button с аргументом 0x34, что вызывает перемещение влево в меню.
  12. Функция main завершается с возвращаемым значением 0, что указывает на успешное выполнение программы.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

8   голосов , оценка 4 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы