2011-08-12 140 views
4
void dispatch_for(dispatch_queue_t *queue, long number, void (* work)(long)){ 
    int loop = number; 
    int i; 
    task_t *ctask; 
    for(i = 0; i<loop;i++){ 
     ctask = create_task((void *)work,number,"for_test"); 
     dispatch_async(queue,ctask); 
    } 
}  

task_t *task_create(void (* work)(void *), void *param, char* name){ 

    //do something 
} 

我得到的工作作为一个函数,需要将它传递给函数create_task。(第一个参数)
我应该如何传递?没有括号的功能
传递函数作为参数

+3

'create_task'和'task_create'应该是相同的函数吗? –

+2

什么是错误/问题?你应该能够逐字通过“工作”。还要检查你的拼写,它是'task_create'还是'create_task'?尽管最好说'typedef void(* workfunction)(void *);',那么你可以在必要时施加'(workfunction)work'。 –

回答

4

名称是指针指向函数:

void work(void) { 
...; 
} 

void main(void) { 
task_create(work, void, void); 
} 
+0

我认为OP希望转发入口参数'work',但它有一个稍微不同的类型。 –

1

只需使用标识符像任何其他参数:

dispatch_for(queue, number, work); 
1

由于您使用的C,和work是一种类型,但您想将其设置为void (*)(void*),只需重新键入work的类型(这可以通过使用typedef来完成)

//declare somewhere at a global level 
typedef void (*task_create_func)(void*); 

//at the point where you want to call task_create 
task_create((task_create_func)work, PARAM1, PARM2); 

另外,如果你不想处理的typedef,你可以简单地使用所需的指针式在做投点呼叫,像这样:

task_create((void (*)(void*))work, PARAM1, PARAM2); 
1

最简单的东西将是一个typedef到想要的函数类型。所以,你可以做

typedef void workfunc_t(void *); 

workfunc_t sample_workfunc; // in order to ensure type-correctness 

void workfunc_t(void *) 
{ 
    // ... 
} 

void dispatch_for(dispatch_queue_t *queue, long number, workfunc_t * work) 
{ 
    int loop = number; 
    int i; 
    task_t *ctask; 
    for(i = 0; i<loop;i++) { 
     ctask = create_task(work, number, "for_test"); 
     dispatch_async(queue,ctask); 
    } 
} 

task_t *task_create(workfunc_t work, void *param, char* name){ 
    //do something 
} 
1

功能work没有在dispatch_fortask_create相同的签名(参数是一个指针,长在其他)

这似乎很奇怪,你要在这两种情况下使用相同的功能