Здесь я все же привожу конкретный пример. У меня есть typedef (из заголовочного файла maplec.h
, определяющего OpenMaple).
typedef struct {
void (M_DECL *textCallBack) ( void *data, int tag, char *output );
void (M_DECL *errorCallBack) ( void *data, M_INT offset, char *msg );
...
} MCallBackVectorDesc, *MCallBackVector;
В моем коде я хочу назначить функции обратного вызова для использования. В примерах из руководства (http://www.maplesoft.com/applications/view.aspx?SID=4383&view=html) это делается с помощью
MCallBackVectorDesc cb = { textCallBack,
0, /* errorCallBack not used */
...
};
Однако я хочу сохранить ссылку на эту переменную cb
в структуре, которую я определил как
struct open_maple {
MCallBackVectorDesc *call_back_vector;
};
Затем я инициализирую с
open_maple->call_back_vector = (MCallBackVectorDesc *)malloc((size_t)sizeof(MCallBackVectorDesc));
(open_maple->call_back_vector)->textCallBack = &textCallBack;
(open_maple->call_back_vector)->errorCallBack = 0;
Этот код не выдает ни предупреждений компилятора, ни Segfaults, но я, похоже, также не получаю никаких вызовов textCallBack, в то время как версия онлайн-примера будет работать. Я пробовал другие определения и назначения, но всегда получал предупреждения или Segfaults.
Он сводится к вопросу: Как мне правильно присвоить указатели на callback-функции, собранные в структуре typedef, если я не хочу присваивать их при инициализации (в объявлении переменной cb)?
Изменить 1
Ниже было высказано предположение, что ошибка возникает из-за того, что я ссылаюсь на функцию textCallBack
как на функцию &textCallBack
, которая генерирует указатель из указателя. Однако пример не работает ни с &
, ни без него. Также обратите внимание, что работает следующий код:
/* some standard libraries */
#include <stdlib.h>
#include <stdio.h>
void function(void){
printf("IAMHERE\n");
};
int main()
{
void (*myfunction)(void) = &function;
myfunction();
return 0;
}
Я использую gcc -o test test.c
для его компиляции.
Изменить 2
Еще несколько расследований показали, что проблема предположительно связана с тем, что я использую OpenMaple.
&function == function
. Даже разыменование функции просто возвращает указатель на функцию.*function == function
08.02.2014&function
для получения указателя на функцию, но было решено, что это ошибка в дизайне K&R C, и был добавлен специальный случай, чтобы он работал так, как должен, в то время как не ломая старые программы.) Таким образом, пример редактирования 1 вводит в заблуждение; еслиtextCallBack
объявлен как указатель на функцию, & по нему действительно будет давать указатель на указатель на функцию. 08.02.2014