Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C语言中将函数作为参数传递给按钮处理程序_C_Function Pointers_Pebble Watch - Fatal编程技术网

在C语言中将函数作为参数传递给按钮处理程序

在C语言中将函数作为参数传递给按钮处理程序,c,function-pointers,pebble-watch,C,Function Pointers,Pebble Watch,我正在开发一个用C编写的应用程序,我正在尝试将函数指针作为参数传递到我的按钮处理程序中,以便从那里调用它。到目前为止,我已经做了以下工作,但我得到一个错误,我调用的对象不是函数 void func(){ ... } static void select_click_handler(ClickRecognizerRef recognizer, void *context){ context(); } static void click_config_provider(void

我正在开发一个用C编写的应用程序,我正在尝试将函数指针作为参数传递到我的按钮处理程序中,以便从那里调用它。到目前为止,我已经做了以下工作,但我得到一个错误,我调用的对象不是函数

void func(){
    ...
}

static void select_click_handler(ClickRecognizerRef recognizer, void *context){
    context();
}

static void click_config_provider(void *context) {
    window_single_click_subscribe(BUTTON_ID_SELECT, select_click_handler);
    window_set_click_context(BUTTON_ID_SELECT, context);
}

int main(void){
    ...
    action_bar = action_bar_layer_create();
    action_bar_layer_set_click_config_provider(action_bar, click_config_provider);
    action_bar_layer_set_context(action_bar, &func);
}
文件:


中选择\u单击\u handler()
函数
上下文
无效*
,因此在调用它之前需要适当地键入它

假设
context
func
,则可以执行此操作

static void select_click_handler(ClickRecognizerRef recognizer, void *context){
    ((void (*)(void)) context)();
}
同样在这一行
action\u bar\u layer\u set\u上下文中(action\u bar,&func)
您不需要
&
只需传递
func
而不是
&func

static void select_click_handler(ClickRecognizerRef recognizer, void *context){
context();
}
在这种情况下,
context
只是指针变量,而不是函数。因此,您必须对其进行类型转换或正确定义,才能将其用于函数调用

但您正在传递函数指针作为参数。所以,我希望这些链接能帮助你


在C语言中,
void*
在许多地方被用来表示通用指针,它可以是指向变量的指针,也可以是指向函数的指针。你在利用后者

在使用时,您需要将其强制转换为正确的类型,否则运行时将不知道该做什么。在您的例子中,正确的类型是不带参数并返回
void
的函数


为此,在调用站点使用
((void(*)(void*))上下文)(
;在
选择\u单击\u处理程序

中,错误发生在哪一行?错误:调用的对象“上下文”不是函数。当试图在
选择中调用它时,单击\u处理程序
上下文
不是一个函数,而是一个
无效*
。您确定上下文是一个函数吗?如果是这样,这将调用强制转换,但我怀疑上下文是上下文。@Rakim,取决于您要调用的函数类型。@Rakim函数指针泛型原型是
(返回类型)(*函数名)(argumnet列表)