1

在 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 声明和设置正确的值?

4

1 回答 1

3

你可以:

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 参考中对其进行硬编码。

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

于 2013-08-09T22:10:20.700 回答