В 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 ++. Я хотел бы, чтобы SC (5)% a в Фортране соответствовал arrayOfS [4] .a в C ++. Как мне объявить и установить правильное значение для массива Fortran SC, который будет иметь этот доступ?
Вы могли бы:
1) передать массив C ++ в процедуру Fortran BIND (C), которая принимает соответствующий аргумент массива.
SUBROUTINE proc(array) BIND(C, NAME='proc')
...
TYPE(SFortran) :: array(*)
При таком подходе вы также можете передать размер массива и сделать аргумент массива явной формой.
б) иметь указатель массива как внешний «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.
Какой подход лучше, зависит от ваших требований!
Других решений пока нет …