它抱怨線程函數(綁定到的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);
}
這編譯沒有警告,並運行良好。
第一個答案解釋瞭如何解決您的問題。 – 2501 2014-12-04 03:10:57