在 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/