Инициализация структуры, содержащей указатели на функции в C - PullRequest
0 голосов
/ 02 мая 2019

Структура box определена в box.h следующим образом:

typedef struct box {
    int (*func1) (const void *p1, const void *p2);
    void (*func2) (void *p3);
} Box;

box.c включает в себя box.h и имеет следующую функцию:

int create_box(int (*func1)(const void *p1, const void *p2), void (*func2)(const void *p3), Box **box) {

create_box вызывается для инициализации блока на основе предоставленных параметров.Я изо всех сил пытаюсь выяснить, как назначить указатели на поля структуры.Во-первых, я начинаю с выделения памяти для **box через (*box) = malloc(sizeof(Box));

Но затем я пытаюсь назначить аргументы указателя функции через

(*box)->func1 = (func1)(&p1, &p2);
(*box)->func2 = (func2)(&p3);

Выполнение этого говорит мне, что всеиз моих указателей не объявлены.Очевидно, что я неправильно понимаю, как работают указатели на функции, но я не понимаю, как я должен их инициализировать (если это слово записи).Я пытался заменить правую сторону на (*func1)(*p1, *p2), (func1)(p1, p2), (*func1)(p1, p2), (*func1)(&p1, &p2) и т. Д., Но они не дали ничего, что я могу понять.Как правильно инициализировать указатели функций этой структуры?

Я работаю в C90, если это актуально.

1 Ответ

6 голосов
/ 02 мая 2019

, если я хорошо понимаю,

(*box)->func1 = (func1)(&p1, &p2);
(*box)->func2 = (func2)(&p3);

находится в int create_box(int (*func1)(const void *p1, const void *p2), void (*func2)(const void *p3), Box **box) {, поэтому вы хотели:

(*box)->func1 = func1;
(*box)->func2 = func2;

Форма (func1)(&p1, &p2); вызывает функцию, адрес которой находится в func1 с адресом p1 и p2 в аргументе ("()" вокруг func1 бесполезен), и это явно не то, что вы хотите, иможет сделать, потому что p1 и p2 не определены.

Но (*box)->func2 = func2; невозможно с вашим текущим кодом, потому что подпись (*box)->func2 и func2не соответствуютВы можете изменить второй аргумент create_box на void (*func2)( void *p3) или изменить struct box на void (*func2) (const void *);

...