Доступ к массиву C ++ из Фортрана?

В 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

Решение

Вы могли бы:

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.

Какой подход лучше, зависит от ваших требований!

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]