2014-12-04 7 views
1

코드를 컴파일 할 때 오류가 계속 발생합니다. 다음과 같이 오류 : 나는 기능, void * start(threadData* data)에 구조체를 전달하기 위해 노력하고있어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]); 

,이 날을 던지고 유지합니다. 어떤 아이디어?

+0

첫 번째 대답은 문제를 해결하는 방법을 설명합니다. – 2501

답변

4
그것은 ( 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); 
} 

이 경고없이 컴파일하고 잘 실행됩니다.

+0

@ paxidiablo 잘 그 정확한 것을 시도하고 그것은 여전히 ​​3 매개 변수에 오류를 준 시작. – jgabb

+0

@jgabb, 질문에 더 많은 정보를 추가해야합니다. 'void * start (void *)'를 사용하면 _exact_ 올바른 타입이됩니다. 그래서 당신이 어딘가에서 오타를 만들었거나 프로토 타입이나 다른 것에 여전히 이전의 선언을 가지고 있다고 생각합니다. 오류 메시지가 같으면 코드를 변경하지 않은 것입니다 (여전히'threadData *'를 언급하고 있기 때문에). – paxdiablo

+0

당신은 정확했습니다 =) 감사합니다! – jgabb

관련 문제