2013-04-03 39 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,並期望它的工作。

一個更好的解決辦法是讓你的回調函數返回void,而是接受一個void *作爲一個地點放置返回值:

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; } 浮子* fFun() { 浮子F = 5.0; return&f; } – resultsway

+1

@purpletech:該代碼已損壞。你拋棄'malloc'的返回值,然後當你說你會返回一個'float *'時返回一個浮點數。你可能想要的東西就像'float * f; f = malloc(sizeof(float)); * f = 5.0;返回f;'。 –

+0

+1 thx。如果你仔細注意,我提供了你提供的malloc解決方案,但我不知道我是否可以返回一個ptr在堆棧中,如float * fFun(){float f = 5.0; return&f; }。它的作品,但它不安全的權利? – resultsway

3

你撒謊編譯器。結果是不可預測的。

+0

你是什麼意思?我怎樣才能回撥通用,所以我可以返回int和浮動? – resultsway

+0

@purpletech:你不能,因爲沒有什麼有用的,你可以用結果做。最好你可能會考慮返回某種變體對象(一個包含union和一個枚舉/標誌的結構就足夠了)。 –

+0

@purpletech:調用者如何知道它是否返回i​​nt或float?也許你想要一個包含一個int,一個float和一個返回的指針的結構體? –

相關問題