Указатели на функции - PullRequest
       7

Указатели на функции

0 голосов
/ 04 января 2019

Привет, ребята, у меня вопрос: как я могу вызвать функцию из структуры enum с указателями?

Например, у меня есть такая структура:

typedef enum struct_e
{
    FUNCTION_ONE,
    FUNCTION_TWO,
    FUNCTION_THREE,
    FUNCTION_FOUR,
}   sctruct_t;

И у меня есть функция, которая получает одну из этих переменных и параметры функции (например, int)

void call_functions(struct_t action, int exemple) {...}
// -> call like this call_functions(FUNCTION_ONE, 45);

И в этой функции мне нужно вызвать одну из функций, подобных этой:

void function_one(int a)
{
    printf("You have %d years old", a);
}

Ответы [ 2 ]

0 голосов
/ 04 января 2019

Я обычно нахожу, что первым шагом при работе с указателем на функцию является использование typedef, чтобы сделать синтаксис более читабельным. Затем такие указатели можно использовать так же, как и любой другой тип данных.

// declares function_ptr as a new type, pointer to function taking an integer parameter and returning void
typedef void (*function_ptr)(int);

// define function pointer p and initialize to point at function one
function_ptr p = function_one;

// call function_one passing 7 as a parameter
(*p)(7);

В этом случае, предполагая, что все функции принимают целое число в качестве параметра, мы можем использовать таблицу указателей для представления всех функций, которые вы хотите вызвать:

function_ptr table[]=
{
    function_one,
    function_two,
    function_three,
    function_four,
};

На данный момент довольно легко вызывать любое количество функций с помощью этого метода.

void call_functions(struct_t action, int exemple)
{
    if( action >= FUNCTION_ONE && action <= FUNCTION_FOUR )
    {
        (table[action])(exemple);
    }
    else
    {
        printf("Unrecognized function %i. Check that function table is up to date\n", (int)action);
    }
}
0 голосов
/ 04 января 2019

Предполагая, что каждая из вызываемых функций имеет тип void (*)(int), вы можете создать массив указателей на функции, используя значения перечисления в качестве индекса массива:

typedef void (*call_func_type)(int);
call_func_type func_list[] = {
    [FUNCTION_ONE] = function_one,
    [FUNCTION_TWO] = function_two,
    [FUNCTION_THREE] = function_three,
    [FUNCTION_FOUR] = function_four
}

Тогда call_functions будет просто индексировать в этот массив:

void call_functions(struct_t action, int example) 
{
    func_list[action](example);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...