在 C++ 和 Fortran 代码之间传递复数数组
Posted
技术标签:
【中文标题】在 C++ 和 Fortran 代码之间传递复数数组【英文标题】:Passing complex number array between C++ and Fortran code 【发布时间】:2012-11-22 21:06:28 【问题描述】:我正在使用 C++ 和 Fortran 代码。 C++ 代码需要调用 Fortran 子例程。 Fortran 子例程的一个参数具有 Fortran 类型 complex
。
C++ 代码在一个文件中,而 Fortran 代码子例程在另一个文件中。我在 64 位 GNU/Linux
系统上使用 gcc
和 gfortran
。
这是一个显示 Fortran 子例程声明的 sn-p(以及一些附加行):
SUBROUTINE minp (AMP,L,L2,FMINP,PHI)
REAL*4 AMP( L ),FMINP( L )
COMPLEX PHI( L )
在 C++ 文件中,我知道传递给 Fortran 代码的参数需要通过引用传递,而不是通过值传递。 Fortran 子例程在 C++ 代码中(在源代码文件的顶部)使用 extern
关键字声明为函数。
extern "C"
minp_ (float *amp, int &L, int &L2, float *fminp, complex *phi);
但是,函数的最后一个参数是一个复杂的 C 数组。怎么可能:
-
为 C/C++ 中的复杂数组分配内存以作为
phi
参数传入?
将数组作为参数传递给 Fortran 子例程,以便 Fortran 代码可以使用内存?
【问题讨论】:
【参考方案1】:为了连接 C(和通过外部 C 的 C++)和 Fortran,我建议使用 Fortran 的 ISO C 绑定。它提供了复杂类型,C_FLOAT_COMPLEX、C_DOUBLE_COMPLEX 和 C_LONG_DOUBLE_COMPLEX,以匹配 C 的类型。通过使用 ISO C 绑定并编写 Fortran 接口声明以匹配 C 代码,您将指示 Fortran 编译器匹配 C 编译器的调用约定。如果您将复杂类型与 ISO C 绑定一起使用,则处理数组与 float/double/long double 数组没有任何不同。 gfortran 手册在“混合语言编程”一章中有示例,并在“内部模块”一章中描述了 ISO C 绑定的类型和内部过程。
【讨论】:
谢谢,M.S.B.这确实是一种可行的方法。以上是关于在 C++ 和 Fortran 代码之间传递复数数组的主要内容,如果未能解决你的问题,请参考以下文章