2012-03-06 37 views
1

我想從我的C++代碼調用FORTRAN函數。該FORTRAN函數是這樣的混合代碼 - 函數成員指針

extern "C" { void FORTRANFUNC(void FCN(int*,double*), int *N); } 

以上報告的FCN功能是一個C++類的成員函數

class CppClass 
{ 
... 
void FCN(int* a, double* b); 
... 
}; 

我想調用這個方法的代碼,但它似乎是不可能的:

FORTRANFUNC(myClass.FCN, &n_); 

編譯器會抱怨,因爲FORTRAN函數想要一個空白FCN功能,而我傳遞一個CppClass :: void函數。

你能幫我嗎?

+0

添加了C++標記,因爲在那裏沒有Fortran行,而且作爲Fortran程序員而不是C++程序員,無法理解它。 – 2012-03-06 15:13:04

+0

其實我很驚訝應該可以很容易地將C void函數傳遞給FORTRAN(77我假設)子程序。 – 2012-03-06 15:14:52

+0

是甚至可能在C? http://www.glenmccl.com/ptr_cmp.htm – 2012-03-06 15:24:05

回答

1

成員函數指針不是指針。他們需要在呼叫現場進行特殊處理。由於Fortran代碼不太可能知道該演練,因此您嘗試執行的操作是不可能的。您必須改用免費功能。由於沒有任何用戶數據的void*參數,唯一的解決方法(我強調:這是非常難找的解決方法)你有使用全局調度(或者動態地創建一個thunk,但這並不容易):

CppClass *obj; 
void dispatch_fcn(int* a, double* b) { 
    obj->fcn(a, b); 
} 

// later: 
obj = &myClass; 
FCN(dispatch_fcn, &n_);