簡體   English   中英

從Fortran訪問C ++結構數組?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM