在C ++和Fortran代码之间传递复数数组

时间:2012-11-22 21:06:29

标签: c++ fortran complex-numbers fortran-iso-c-binding

我正在使用C ++和Fortran代码。 C ++代码需要调用Fortran子例程。 Fortran子例程的一个参数具有Fortran类型complex

C ++代码在一个文件中,Fortran代码子例程在另一个文件中。我在64位gcc系统上使用gfortranGNU/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数组。怎么可能:

  1. 在C / C ++中为复杂数组分配内存以作为phi参数传递?
  2. 将数组作为参数传递给Fortran子例程,以便Fortran代码可以使用内存吗?

1 个答案:

答案 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绑定的类型和内部过程。