错误使用void表达式无效

时间:2014-03-29 13:57:17

标签: c xenomai

我有一个功能int rt_task_start (RT_TASK *task, void(*task_func)(void *arg), void *arg) 我在第二个参数中传递带参数的函数。

  1. 当我只传递一个功能名称时,没有问题。(正如预期的那样,它正在工作)。 rt_task_start(&demo_task1, demo, 1);
  2. 但是当我通过rt_task_start(&demo_task1, demo(&val), 1);时,它会给我错误error: invalid use of void expression。之前定义了变量val。 int val = 0;
  3. 当我使用此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
  4. int *val; *val = 0; rt_task_start(&demo_task1, demo(&val), 1);这也给了我错误。
  5. 我无法理解我应该传递什么,作为一个无效指针。它给了我错误。请任何想法!

3 个答案:

答案 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;