2014-12-04 413 views
1

我試圖編譯我的代碼時不斷收到錯誤。錯誤如下:C警告:不兼容的指針類型通過

warning: incompatible pointer types passing 
    'void *(threadData *)' to parameter of type 'void * (*)(void *)' 
    [-Wincompatible-pointer-types] 
     pthread_create(&threads[id], NULL, start,&data[id]); 

我想一個結構傳遞給函數,void * start(threadData* data),這不斷拋出我送行。有任何想法嗎?

+0

第一個答案解釋瞭如何解決您的問題。 – 2501 2014-12-04 03:10:57

回答

4

它抱怨線程函數(綁定到的pthread_create第三個參數),你可以修改採取void *參數,然後用它做任何事情之前將它轉換回:

void *start (void *voidData) { 
    threadData *data = voidData; 
    // rest of code here, using correctly typed data. 

可能也選擇將數據指針(第四個參數)強制到預期的類型:

(void*)(&(data[id])) 

,但我不認爲這是必要的,因爲一個void *爲s無法自由兌換大多數其他指針。


你可以看到這個問題在這個小而完整的程序:

#include <stdio.h> 
#include <string.h> 
#include <pthread.h> 

struct sData { char text[100]; }; 

void *start (struct sData *data) { 
     printf ("[%s]\n", data->text); 
} 

int main (void) { 
     struct sData sd; 
     pthread_t tid; 
     int rc; 

     strcpy (sd.text, "paxdiablo"); 
     rc = pthread_create (&tid, NULL, start, &sd); 
     pthread_join (tid, NULL); 

     return 0; 
} 

,在編譯,你會看到:

prog.c: In function 'main': 
prog.c:20:2: warning: passing argument 3 of 'pthread_create' from 
      incompatible pointer type [enabled by default] 
      In file included from prog.c:3:0: 
       /usr/include/pthread.h:225:12: note: expected 
        'void * (*)(void *)' but argument is of type 
        'void * (*)(struct sData *)' 

請記住,這只是一個警告,不是一個錯誤,但是,如果你想讓你的代碼乾淨地編譯,那麼值得擺脫。在製作這個答案(巴數據參數鑄造)的頂部提到的更改爲您提供了以下線程函數:

void *start (void *voidData) { 
     struct sData *data = voidData; 
     printf ("[%s]\n", data->text); 
} 

這編譯沒有警告,並運行良好。

+0

@paxidiablo好吧,我試過那個確切的東西,它仍然給第三個參數上的錯誤,開始。 – jgabb 2014-12-04 03:26:09

+0

@jgabb,那麼你需要添加更多信息的問題。使用'void * start(void *)'使它成爲_exact_的正確類型,所以我認爲你在某個地方犯了一個錯字,或者你仍然在原型或其他東西中使用舊的聲明。如果錯誤消息是相同的,那麼你沒有改變代碼(因爲它仍然提到'threadData *')。 – paxdiablo 2014-12-04 03:31:20

+0

你是對的=)謝謝! – jgabb 2014-12-04 04:38:11

相關問題