12

我有一个函数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 casterror: invalid use of void expression
  4. int *val; *val = 0; rt_task_start(&demo_task1, demo(&val), 1);这也给了我错误。

我不明白我应该传递什么,作为一个空指针。它给了我错误。请有任何想法!

4

3 回答 3

6
void (*task_func)(void *arg);

上面的语句定义task_func为一个指向函数的指针,该函数接受一个类型的指针void *并且不返回任何值。

因此,当你调用你的函数时rt_task_start,你应该传递一个指向函数的指针作为第二个参数。此外,您应该传递一个类型的指针void *作为第三个参数,而不是整数。函数名的计算结果是指向函数的指针,因此您可以简单地将函数名作为参数值传递,或者您可以&在函数名之前使用地址运算符。

int arg = 4;

// both calls are equivalent

rt_task_start(&demo_task1, demo, &arg);
rt_task_start(&demo_task1, &demo, &arg);
于 2014-03-29T14:07:41.043 回答
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 中不可用。但是,您可以传递函数指针,然后单独传递要应用的参数(这就是函数签名建议您应该这样做)。但是您必须将该参数作为指针而不是文字传递。

于 2014-03-29T14:07:37.520 回答
0

你当然想要:

  int i=1;
  rt_task_start(&demo_task1, demo, (void*) &i);

只需通过匹配参数类型,记住第二个参数只是一个函数指针,而不是带有自己参数的函数调用,只有在 rt_task_demo 中调用它时才会使用它自己的参数。如果你想在函数'rt_task_demo'中使用值'1',你会像这样重铸它

int ii = *(int*) arg;
于 2014-03-29T14:15:43.053 回答