2014-03-29 62 views
4

我有一个功能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);这也给我错误。

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

+2

此功能的用意是什么?你想第二个参数是一个函数指针还是不同的数据类型?它不能同时存在。另外,'int * val; * val = 0;''可能会创建一个分段错误,因为您正在为未定义的地址位置分配一个值。 – lurker

+0

@mbratch thanx指出我,我想第二个函数只有一个函数指针。其实我对第二个参数'void(* task_func)(void * arg)'它可以采用什么类型的参数感到困惑。尽管如此,我也可以发出争论,对于情况2,3,4而言,这些都是不正确的。 – Merom

回答

4
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); 
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.你可以,但是,通过函数指针,然后分别传递要应用的参数(这是函数签名建议您应该执行的操作)。但是你必须将这个论点作为指针传递,而不是文字。

0

当然,你想:

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

只需通过匹配的参数类型,记得第二个参数仅仅是一个函数指针,而不是它自己的参数的函数调用,它自己的说法只是用来当你在rt_task_demo中调用它时。如果您希望在函数'rt_task_demo'中使用值'1',您可以将其重新编码为

int ii = *(int*) arg; 
相关问题