2012-03-06 35 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_);