2014-03-29 63 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; 
相關問題