gpt4 book ai didi

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

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

在 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++ 端将数组指针作为 extern "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/

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