c++ - 从 Fortran 访问 C++ 结构数组?

标签 c++ fortran dynamic-arrays language-interoperability

在 C++ 中,我分配了一个 S 数组。在 Fortran 中,我想访问该数组的元素。我怎样才能做到这一点?

C++:

struct S {double a; double b;};
S *arrayOfS;
arrayOfS = (S *)new S[123]; // allocate

Fortran 2003:

USE ISO_C_Binding
TYPE, BIND(C) :: SFortran
REAL(c_double) :: a,b
END TYPE SFortran

S 和 SFortran 现在应该可以互操作,但我还需要有一种方法来访问 C++ 中声明的数组的元素。我想让 Fortran 中的 SC(5)%a 对应于 C++ 中的 arrayOfS[4].a 。如何为具有此访问权限的 Fortran 数组 SC 声明并设置正确的值?

最佳答案

你可以:

1) 将 C++ 数组传递给采用适当数组参数的 Fortran BIND(C) 过程。

SUBROUTINE proc(array) BIND(C, NAME='proc')
  ...
  TYPE(SFortran) :: array(*)

通过这种方法,您可能还希望传递数组的大小并使数组参数显式形状。

b) 将数组指针作为 C++ 端的外部“C”全局变量,然后通过 Fortran 模块变量与 BIND(C) 进行互操作。

MODULE some_module
  USE, INTRINSIC :: ISO_C_BINDING, ONLY: C_PTR, C_F_POINTER
  ...
  TYPE(C_PTR), BIND(C, NAME='arrayOfS') :: array_ptr
  ...
  ! In a procedure in the module...
  TYPE(SFortran), POINTER :: array(:)
  CALL C_F_POINTER(array_ptr, array, [123])

同样,它可能适合单独提供可用的数组大小,以避免在 C_F_POINTER 引用中对其进行硬编码。

哪种方法最好取决于您的要求!

关于c++ - 从 Fortran 访问 C++ 结构数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18155017/

相关文章:

c++ - 在 C/C++ 中生成遵循正态分布的随机数

c++ - 与英特尔编译器混合的 Fortran/C++ : undefined references to 'system_'

oop - fortran 2003 中的运行时多态性

c - 为什么我们需要动态内存分配,尽管我们可以使用可变长度数组来代替?

在 C 中创建矩阵

c++ - 按下按钮后如何延迟输出约 15 分钟?

c++ - 简单的双端队列初始化问题

c++ - 在函数中修改动态二维数组

c++ - 尝试在C++中实现运行长度平滑算法

fortran - 在 OpenMP 区域内调用内部子程序