[英]Access array of C++ structs from Fortran?
在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引用中對其進行硬編碼。
哪種方法最好取決於您的要求!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.