2011-08-12 176 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相同的簽名(參數是一個指針,長在其他)

這似乎很奇怪,你要在這兩種情況下使用相同的功能