2016-07-20 2 views
0

에서 void (*) (void *) 위 경고를 받고 이해하고 있지만이를 수정하는 방법을 알지 못합니다. 내 코드는 아래에 있지만, 기본적으로 구조체에 함수 포인터를 저장하고 내 메인에서 호출하는 다른 함수에서 구조체를 초기화하는 것입니다. 코드는 기본 함수 (예 : free())와 함께 사용할 때 컴파일되는 것처럼 보이지만 아래 test_func 함수와 함께 사용할 때는 컴파일되지 않습니다. 생각?함수 포인터 호환되지 않는 포인터 형식 void (my_type *)

구조체 :

typedef struct my_struct { 
    my_type **double_pointed; 
    int num; 
    void (*funcp)(void *data); 
    } my_struct_t; 

초기화 기능 : 내가 가리 할

my_struct_t *init(int num, void (*my_funcp)(void *data)) { 

    // unimportant code to the problem, but basically just some mallocs for the other data 

    my_struct_t *my_str; 
    my_str->funcp = my_funcp; 

    return struct; 
} 

기능 :

void desired_func(my_type *obj) {} 

초기화 FUNC에 내 전화 :

init(5, desired_func); 
,

전체 오류 :

호환 포인터 유형에 할당 '무효 (*) (공극 *)' '무효 (my_type *)'상기 초기화 기능의 라인

에서 :

my_struct_t *my_str; 
my_str->funcp = my_funcp; 

답변

4

함수 포인터 유형을 함수와 일치하도록 변경하십시오. :

void (*funcp)(my_type *data); 

다른 서명 (예 : 다른 매개 변수 유형)의 기능을 사용하려면 명시 적 형변환을 추가 할 수 있습니다. 예를 들어 :

desired_func 기능 (또는 그의 시그니처 funcp 함수 포인터를 일치하지 않는 다른 기능) 함수 포인터를 통해 호출 할 필요가있는 시간이, 함수 포인터가있을 것이다
init(5, (void (*)(void*)) desired_func); 

참고 주조한다 함수를 호출하기 전에 원래 유형 (이 경우 void (*)(my_type*))으로 되돌려 보내거나 정의되지 않은 동작을 호출합니다.

다른 (다소 나은) 대안은 desired_func 이와 같은 정의를 변경하는 것이다

void desired_func(void *vobj) { 
    my_type* obj = vobj; 
    /* rest of the code */ 
} 

주 즉, (직접 함수 포인터를 통해 또는) 주소로 전달되는 객체의 유형을 desired_func를 호출 할 때 매개 변수는 my_type이거나 함수 내에서 obj의 참조 해제가 필요합니다 (그리고 정렬이 캐스트 자체조차 다를 경우) 정의되지 않은 동작이 호출됩니다.

캐스팅 할 때 정의되지 않은 동작을 처리하기 위해 추가 된 복잡성은 위에서 언급 한대로 캐스팅에 대한 조언을 의미합니다. 이러한 캐스팅이 필요할 경우 디자인에 문제가 있음을 나타낼 수 있습니다. 예. 요구 사항을 좀 더 생각한다면 아마도 더 좋은 해결책 일 것입니다.

+0

문제는 모든 데이터 유형에 대해 작동해야한다는 것입니다. 따라서 void * – bobbyyu10

+0

@ bobbyyu10 : 나는 지금도이를 처리했습니다. –

+1

'void *'로 변환하거나 변환하는 것은 캐스트를 필요로하지 않으므로'my_type * obj = vobj;'이면 충분합니다. – user3386109

관련 문제