繁体   English   中英

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

[英]Passing complex number array between C++ and Fortran code

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

C ++代码在一个文件中,Fortran代码子例程在另一个文件中。 我在64位GNU/Linux系统上使用gccgfortran

这是一个显示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代码可以使用内存吗?

对于C(和通过extern C的C ++)和Fortran的接口,我建议使用Fortran的ISO C绑定。 它提供复杂类型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绑定的类型和内部过程。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM