2016-05-20 57 views
0

考慮下面的小例子:如何將指針返回到稍微修改過的函數版本?

#include <stdio.h> 

double square(double x); 
double cube(double x); 

int main(){ 
    double (*pArray[2]) (double x) = {square, cube}; 
    return 0; 
} 

double square(double x){ 
    return (x*x); 
} 

double cube(double x){ 
    return (x*x*x); 
} 

現在,假設*我們希望,在僞代碼將採用類似這樣(的+是不是一個真正此外,記)功能:

functionPointer funcB(y, functionPointer funcA){ 
    functionPointer funcC = y + &funcA; 
    return funcC; 
} 

使得funcC具有與funcA相同的簽名並且呼叫funcC(x)返回y + funcA(x)。我們怎樣才能做到這一點?我不能想出辦法去做。


*可能的東西是有用的像

for(double y = 0; y < 1; y += 0.1){ 
    for(double x = 0; x <= y; x += 0.1){ 
     printf("%f\n", funcB(y, pArray[0])(x)); 
     printf("%f\n", funcB(y, pArray[1])(x)); 
    } 
} 
+0

'y'的類型是什麼? – dbush

+0

你爲什麼要這麼做? – Martin

+0

它看起來非常類似於js中的某種回調,我懷疑它會影響OP的問題風格。無論如何,這是什麼打印..?那個新的C函數?在這裏,使用僞代碼並將它與C方言混合,當他們讀到這個問題時,肯定會給C的新手造成混淆。 – t0mm13b

回答

3

你描述的被稱爲關閉(閉包可以被看作是與捕獲的一些數據的匿名函數)。不幸的是,你不能直接在C中創建閉包。最接近你可以得到的是C++中的函子對象(和lambda,它是創建函數的一種語法糖),但是這些函數通常不能轉換爲函數指針。

您還可以通過引入用於維護狀態的附加參數來模擬閉包。但是這個狀態必須得到明確的管理。


從理論上講,你可以分配一些內存,寫一些機器碼那裏,標誌着達內存爲可執行文件,並創建函數指針的代碼。然而,這將非常依賴平臺和非常複雜的任務。

0

對於給出的示例,您不需要額外的函數指針。你可能只是這樣做:

double funcB(double y, functionPointer funcA, double x){ 
    return y + funcA(x); 
} 
... 
for(double y = 0; y < 1; y += 0.1){ 
    for(double x = 0; x <= y; x += 0.1){ 
     printf("%f\n", funcB(y, pArray[0], x)); 
     printf("%f\n", funcB(y, pArray[1], x)); 
    } 
} 
+0

但是,如果我的(實際)代碼依賴於函數指針,即如果我需要將函數funcB的返回值傳遞給某個其他函數(例如,在做數字分析? –