2013-04-03 1 views
1

아래 코드에서 int은 작동하지만 float이 아닌 이유는 무엇입니까? 결과는 다음과 같습니다.왜 float를 반환하는 함수가 void * callback에서 작동하지 않습니까?

voidptr.c :

#include <stdio.h> 

typedef void* (*Fn)(); 

int Fun() 
{ 
    return 5; 
} 

float fFun() 
{ 
    return 5.0; 
} 


void callfun(Fn f) 
{ 
    printf ("%d \n", f()); 
} 

void callffun(Fn f) 
{ 
    printf ("%f \n", f()); 
} 



int main() 
{ 

    callfun(Fun); // works 
    callffun(fFun); // --> doesnt work ?? 
    printf ("%f", fFun()); // works 

    return 0; 
} 

출력 :

5 
0.000000 
5.000000 
+0

실제로 작동하지 않습니다. 당신은 방금 방향 발로 쏘았 고 어젯밤의 술에서 이미 감각이 없었던 발가락 중 하나를 쳤습니다. –

+2

"작동하지 않는다"는 것은 무엇을 의미합니까? –

+0

"작동하지 않음"은 무엇을 의미합니까? 컴파일 타임 오류, 런타임 오류? 구체적으로 기재하십시오. – OldProgrammer

답변

2

void*float으로 전송할 수없고 작동 할 것으로 기대됩니다. 미리 알아야 할 것 -이 여전히 문제가

typedef void (*Fn) (void *); 

void Fun(void *ptr) 
{ 
    *(int *)ptr = 5; 
} 

void fFun(void *ptr) 
{ 
    *(float *)ptr = 5.0; 
} 

void callfun(Fn f) 
{ 
    int num; 
    f(&num); 
    printf ("%d \n", num); 
} 

void callffun(Fn f) 
{ 
    float num; 
    f(&num); 
    printf ("%f \n", num); 
} 

:

더 나은 솔루션은 반환 값을 드롭 콜백 기능을 무효 반환해야하지만 위치로 * 빈 공간을 허용하는 것 콜백에 전달 된 포인터가 가리키는 변수의 종류.

+0

아래 두 가지 작업은 스택 ptr을 반환하는 것은 좋지 않습니다. 내 첫 번째 예제에서 int가 작동하는 이유는 아직도 궁금합니다. float * fFun() { float * f; f = (float *) malloc (sizeof (float)); * f = 5.0; return f; } float * fFun() { float f = 5.0; 반환 & f; } – resultsway

+1

@purpletech : 코드가 깨졌습니다. 'malloc'의 리턴 값을 버리고 float *을 반환한다고 말하면 플로트를 반환합니다. 아마 당신이 원하는 것은'float * f; f = malloc (sizeof (float)); * f = 5.0; f를 돌려 준다. –

+0

+1 thx. 주의 깊게 살펴보면, 내가 제공 한 동일한 malloc 솔루션을 제공했지만 float * fFun() {float f = 5.0; 같은 스택에서 ptr을 반환 할 수 있는지 궁금합니다. 반환 & f; }. 그것은 작동하지만 그 안전하지 않은 권리? – resultsway

3

당신은 컴파일러에게 거짓말을하고 있습니다. 결과는 예측할 수 없습니다.

+0

무엇을 의미합니까? int를 반환하고 float을 반환 할 수 있도록 어떻게 콜백을 일반화 할 수 있습니까? – resultsway

+0

@purpletech : 당신은 그 결과로 할 수있는 유용한 것이 없으므로, 할 수 없습니다. 기껏해야 어떤 종류의 변형 객체 (union과 enum/flag를 포함하는 구조체 만 있으면 충분)를 반환하는 것을 고려할 수 있습니다. –

+0

@purpletech : 발신자가 int 또는 float을 반환했는지 어떻게 알 수 있습니까? 아마도 int, float 및 리턴 된 결과를 나타내는 구조체가 필요하겠습니까? –

관련 문제