그것은 (
pthread_create
의 세 번째 매개 변수에 바인딩) 스레드 기능, 당신은
void *
인수를하고 그것으로 아무것도하기 전에 다시 캐스팅 것을 수정할 수에 대해 불평
:
void *start (void *voidData) {
threadData *data = voidData;
// rest of code here, using correctly typed data.
당신 을 할 수있다도 예상되는 유형으로 데이터 포인터 (네 번째 매개 변수)를 강요하는 선택 :
(void*)(&(data[id]))
하지만 void *
이의이기 때문에 그게 필요한 생각하지 않습니다 대부분의 다른 포인터들간에 자유롭게 변환 될 수 있습니다.
당신은이 작은 아직 완료 프로그램에서 문제를 볼 수 있습니다
#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