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

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

  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
Похожие ответы