вызов функции из структуры - PullRequest
0 голосов
/ 09 июня 2011

У меня есть следующий код. Я просто хочу знать значение последней строки кода.

typedef struct Details 
{
int D1; 
int D2;
} Sdetails;




typedef struct  Variable    
{
    int   Type; 
    Sdetails  i;
}Varialbl3;


typedef XAN_BOOL (*returnfunction)(variabl3* Data);


typedef struct _function
{
    returnfunction          fr;

}function1;


function1 *f1;
variabl3  v3;

f1->fr(&v3);

Что означает последняя строка f1-> fr (& v3)? Я не понимаю концепции.

Ответы [ 4 ]

4 голосов
/ 09 июня 2011

f1 - указатель на структуру. Структура имеет член с именем fr, который является указателем на функцию. Функция принимает указатель на variabl3 и возвращает XAN_BOOL.

Таким образом, f1->fr(&v3) вызывает функцию, на которую указывает f1->fr, предоставляя адрес v3 в качестве единственного аргумента и игнорируя возвращаемое значение.

2 голосов
/ 09 июня 2011

Вызывает функцию fr.

f1 - это указатель на function1 (это структура):

typedef struct _function
{
    returnfunction          fr;
}function1;

function1 имеет члена - aуказатель на функцию с именем fr.Функция, указатель на fr принимает один аргумент - variabl3:

// pointer to function, taking one argument with type 
// `variabl3` and returns typedef struct _function
typedef XAN_BOOL (*returnfunction)(variabl3* Data);

Итак, f1->fr(&v3) вызывает fr и передает v3 в качестве параметра.Возвращаемое значение - XAN_BOOL, как описано в typedef.


Кстати, если это реальный код - это неопределенное поведение , поскольку f1 равно неинициализированным .

1 голос
/ 09 июня 2011

f1 - указатель, своего рода структура; единственный член этой структуры является указателем на функцию. Последняя строка вызывает функцию, удерживаемую указателем в экземпляре этой структуры, и передает адрес экземпляра структуры variable3 в качестве аргумента функции.

0 голосов
/ 09 июня 2011

Это указатель на функцию: в основном вы вызываете абстрактную функцию, которую можно установить где-то еще.

У вас должна быть реальная функция где-то вроде:

XAN_BOOL realFunction(variabl3* pxData) { return (pxData==0); }

Затем вы можете сделать: f1->fr = realFunction: указатель вашей функции указывает на реальную функцию.Затем, когда вы вызываете f1-> fr после, он вызывает realFunction.

Это широко используется во многих шаблонах проектирования: когда вы хотите зарегистрировать обратные вызовы, в слушателях / триггерах, когда вы хотите реализоватьобъектно-ориентированный дизайн в чистом C, когда вы хотите использовать UI (вы привязываете поведение к кнопке, например, в GTK).

Надеюсь, это поможет, если что-то неясно, спросите в комментарии, и я 'буду редактировать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...