gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 02:02:10 27 4
gpt4 key购买 nike

我同时使用 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 代码的参数需要按引用传递,而不是按值传递。 Fortran 子例程在 C++ 代码中(在源代码文件的顶部)使用 extern 关键字声明为函数。

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 绑定(bind)。它提供了复杂类型 C_FLOAT_COMPLEX、C_DOUBLE_COMPLEX 和 C_LONG_DOUBLE_COMPLEX,以匹配 C 的类型。通过使用 ISO C 绑定(bind)并编写 Fortran 接口(interface)声明来匹配 C 代码,您将指示 Fortran 编译器匹配 C 编译器的调用约定。如果将复杂类型与 ISO C 绑定(bind)一起使用,则处理数组与处理浮点/ double /长 double 组没有任何不同。 gfortran 手册在混合语言编程一章中有示例,在内部模块一章中描述了 ISO C 绑定(bind)的类型和内部过程。

关于c++ - 在 C++ 和 Fortran 代码之间传递复数数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13519981/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com