我有一个功能int rt_task_start (RT_TASK *task, void(*task_func)(void *arg), void *arg)
我在第二个参数中传递带参数的函数。
rt_task_start(&demo_task1, demo, 1);
rt_task_start(&demo_task1, demo(&val), 1);
时,它会给我错误error: invalid use of void expression
。之前定义了变量val。 int val = 0;
rt_task_start(&demo_task1, demo(val), 1);
来电时,显示错误Warning passing argument 1 of 'demo' makes pointer from integer without a cast
,然后显示error: invalid use of void expression
。int *val;
*val = 0;
rt_task_start(&demo_task1, demo(&val), 1);
这也给了我错误。我无法理解我应该传递什么,作为一个无效指针。它给了我错误。请任何想法!
答案 0 :(得分:5)
void (*task_func)(void *arg);
上述语句将task_func
定义为指向函数的指针,该函数接受类型void *
的指针并且不返回任何值。
因此,当您调用函数rt_task_start
时,应该将指向函数的指针作为第二个参数传递。此外,您应该传递类型为void *
的指针作为第三个参数,而不是整数。函数名称求值为指向函数的指针,因此您只需将函数名称作为参数值传递,或者可以在函数名称前使用address-of运算符&
。
int arg = 4;
// both calls are equivalent
rt_task_start(&demo_task1, demo, &arg);
rt_task_start(&demo_task1, &demo, &arg);
答案 1 :(得分:0)
我不确定(1)中的代码是如何编译的。但这是你应该使用的:
int rt_task_start (RT_TASK *task, void(*task_func)(void *arg), void *arg);
int val = 1;
rt_task_start(&demo_task1, demo, &val);
你不能传递绑定到特定参数的函数指针,这类似于闭包,它在C中不可用。但是,你可以传递函数指针,然后单独传递你想要的参数。 apply(这是函数签名建议你应该做的)。但是你必须将该参数作为指针传递,而不是文字。
答案 2 :(得分:0)
当然你想要:
int i=1;
rt_task_start(&demo_task1, demo, (void*) &i);
只需匹配参数类型,记住第二个参数只是一个函数指针,而不是带有自己参数的函数调用,只有在rt_task_demo中调用它时才会使用它自己的参数。如果您想使用值' 1'在函数' rt_task_demo'你会像
那样重铸它int ii = *(int*) arg;