2013-03-16 2 views
5

struct person 형식의 데이터를 연결된 목록에 전달하므로 각 노드의 데이터 포인터가 struct Person을 가리 킵니다.void *에서 struct로 캐스팅

struct Person { 
char name[16]; 
char text[24]; 
}; 

나는 목록을 통과 트래버스에 대한

traverse(&list, &print); 

프로토 타입을 호출하여 각 노드의 이름/텍스트를 인쇄하려고은 다음과 같습니다

void traverseList(struct List *list, void (*f)(void *)); 

목록은 다음과 같이 정의된다 :

struct List { 
struct Node *head; 
}; 

내 페이지 rint 함수는 무효를 받아들입니다. * data :

print(void *data) { .... } 

저는 구조체 Person에 데이터를 캐스트해야합니다. 맞습니까?

struct Person *person = (struct Person *)data; 
printf("%s", person->name); 

"호환되지 않는 포인터 유형에서 초기화"경고가 있기 때문에 충분하지 않습니다. 이 경우 void *를 성공적으로 캐스팅 할 수 있습니까? 고맙습니다.

+0

'traverse'의 프로토 타입은 무엇입니까? 그리고 어떤 타입이'list'입니까? –

+0

트래버스 할 목록을 전달하는 방법과 실제로 인쇄를 사용하는 방법을 확인할 수 있습니다. 네가 보여준 모든것이 일치하는 것 같다. – unxnut

+0

@ValeriAtamaniouk 질문을 편집하여 질문을 포함 시켰습니다. – user1889966

답변

3

문제는 캐스트하지, 또는 심지어 방법을 당신이 주변에 기능을 전달하는 :

void print (void* data) 
{ 
    printf("%s", ((struct Person*)data)->name); 
} 

void traverseList (struct List *list, void(*f)(void*), void* data) 
{ 
    f(data); 
} 

그런 다음 호출 할 수 있습니다 traverseList : 당신이 계신 것 같다 . 문제는 print 선언에 반환 유형이 누락되어 있다는 것인데,이 경우 보통 int으로 간주됩니다. 컴파일러는 을 기대하는 함수에 int (*)(void*)을 전달하기 때문에 불평하고 있습니다.

수정하기가 쉽습니다. voidprint 함수 선언 앞에 추가하기 만하면됩니다. 참조 :

https://gist.github.com/ods94065/5178095

1

내 인쇄 기능은 무효 * 데이터

내가 struct Person *을 수용하여 print 기능을 다시 말할 것

을 받아들입니다.

+0

그 이유는 무엇입니까? C에서'void *'는 구조체에 대한 비 const 포인터와 호환됩니다. –

+0

그냥 캐스팅 할 필요가 없기 때문에. – duDE

+0

당신은 여전히 ​​캐스팅해야 할 것입니다 - 함수를 넘겨 줄 때'void (*) (struct Person *)'에서'void (*) (void *) '로 형변환해야합니다. 그게 이식성이 덜 안전하고 IMO가 덜 우아하다고 생각합니다. –

0

traverseList 함수는 void 포인터를 사용하는 함수 포인터를 허용하지만 해당 void 데이터에 대한 인수를 허용하지 않습니다.

traverseList (&list, &print, &person); 
+0

'traverse'가'print '에 제공하는 인수는'traverse' resp의'struct List *'인수의'data' 멤버라고 생각합니다. 리스트의 다음 노드. –

관련 문제