1

C++ では、S の配列を割り当てます。Fortran では、この配列の要素にアクセスしたいと考えています。これどうやってするの?

C++:

struct S {double a; double b;};
S *arrayOfS;
arrayOfS = (S *)new S[123]; // allocate

フォートラン 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++ 側で 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 リファレンスでハードコーディングするのを避けるために、配列のサイズを個別に利用できるようにしておくとよいでしょう。

どのアプローチが最適かは、要件によって異なります。

于 2013-08-09T22:10:20.700 に答える