我正在使用C ++和Fortran代码。 C ++代码需要调用Fortran子例程。 Fortran子例程的一个参数具有Fortran类型complex
。
C ++代码在一个文件中,Fortran代码子例程在另一个文件中。我在64位gcc
系统上使用gfortran
和GNU/Linux
。
这是一个显示Fortran子例程声明(以及一些其他行)的片段:
SUBROUTINE minp (AMP,L,L2,FMINP,PHI)
REAL*4 AMP( L ),FMINP( L )
COMPLEX PHI( L )
在C ++文件中,我理解传递给Fortran代码的参数需要通过引用传递,而不是通过值传递。使用extern
关键字将Fortran子例程声明为C ++代码中的函数(位于源代码文件的顶部)。
extern "C"
{
minp_ (float *amp, int &L, int &L2, float *fminp, complex *phi);
}
但是,该函数的最后一个参数是一个复杂的C数组。怎么可能:
phi
参数传递?答案 0 :(得分:4)
对于C(和C ++通过extern C)和Fortran的接口,我建议使用Fortran的ISO C Binding。它提供复杂类型C_FLOAT_COMPLEX,C_DOUBLE_COMPLEX和C_LONG_DOUBLE_COMPLEX,以匹配C的类型。通过使用ISO C Binding并编写Fortran接口声明来匹配C代码,您将指示Fortran编译器匹配C编译器的调用约定。如果将复杂类型与ISO C Binding一起使用,则处理数组与float / double / long double数组没有任何不同。 gfortran手册在“混合语言编程”一章中有示例,并在“内部模块”一章中描述了ISO C绑定的类型和内部过程。