2015-05-27 4 views
-1

У меня проблема с указателем функции. У меня есть этот typedef:Как правильно использовать указатель функции

typedef struct patchwork *(*create_patchwork_value_fct) 
              (const enum nature_primitif); 

, который является общим для него (реализован в другом файле). Я хочу назвать это с помощью ввода. Как мне это сделать ?

+0

Этот указатель функции typedef работает точно так же, как если бы вы делали 'typedef int * obscure_t; ... obscure_t ptr = & some_int; ' – Lundin

ответ

1

Вы должны

  1. Определить переменную типа указателя функции в typedef ред.
  2. Укажите адрес функции, имеющей с ней одну и ту же подпись.
  3. Используйте переменную как normal имя функции, чтобы вызвать вызов функции.

Псевдо-код

Если у вас есть функция, как

struct patchwork * funccall(const enum nature_primitif) 
{ 
    //do something 
} 

, а затем, вы можете сделать

create_patchwork_value_fct fp= funccall; 
struct patchwork * retptr = NULL; 
enum nature_primitif enumVal = <some enum value>; 

retptr = fp(enumVal); 

Может быть, вы можете прочитать this answer получить больше понимания.

+1

Я что-то упустил? Is not create_patchwork_value_fct typedef, а не сам func ptr? – mjs

+1

Три правки позже, и он понял это правильно ;-) –

+0

@mjs Я сделал это неправильно, исправил. :-) –

0

Это разве на самом деле указатель функции - это определение типа указателя функции:

typedef struct patchwork *(*create_patchwork_value_fct) (const enum nature_primitif);

Таким образом, это определяет тип указателя на функцию под названием create_patchwork_value_fct. Это указатель на функцию, которая принимает один параметр (const enum nature_primitif) и возвращает struct patchwork* - то есть указатель на структуру патчей.

Давайте посмотрим, как это можно было бы использовать:

void someFunc(create_patchwork_value_fct funcToCall, enum param) 
{ 
    funcToCall(param); 
} 

struct patchwork* CreateAPatchworkValue(enum nature_primitif enumVal) 
{ 
    struct patchwork* pwork = malloc(sizeof(struct patchwork)); 
    pwork->someVal = enumVal; 
    return pwork; 
} 


void main() 
{ 
    someFunc(CreateAPatchworkValue, <a valid nature_primitif enumeration value>) 
} 

в этом примере, main() вызовы someFunc(), передавая ему указатель на CreateAPatchworkValue в качестве параметра funcToCall, а значение из nature_primitif перечисления.

someFunc затем вызывает funcToCall, что на самом деле является вызовом CreateAPatchworkValue.

Смежные вопросы