next up previous contents
След.: Объектно-ориентированное программирование Выше: Средства взаимодействия с C Пред.: Взаимодействие глобальных данных   Содержание

Примеры

Приведем два примера взаимодействия Фортрана и C из [12].

Пусть в C функция имеет прототип

int CLibF(void* sendbuf, int sendcount, int *recvcounts)

Модуль Фортрана:

MODULE FTN_C

INTERFACE

INTEGER (C_INT) FUNCTION C_LIBRARY_FUNCTION &

& (SENDBUF, SENDCOUNT, RECVCOUNTS), BIND(C, NAME='CLibF')

USE ISO_C_BINDING

IMPLICIT NONE

TYPE (C_PTR), VALUE :: SENDBUF

INTEGER (C_INT), VALUE :: SENDCOUNT

TYPE (C_PTR), VALUE :: RECVCOUNTS

END FUNCTION C_LIBRARY_FUNCTION

END INTERFACE

END MODULE FTN_C

Собственно вызов функции C из Фортрана:

USE ISO_C_BINDING, ONLY: C_INT, C_FLOAT, C_LOC

USE FTN_C

...

REAL (C_FLOAT), TARGET :: SEND(100)

INTEGER (C_INT) :: SENDCOUNT

INTEGER (C_INT), ALLOCATABLE, TARGET :: RECVCOUNTS(:)

...

ALLOCATE( RECVCOUNTS(100) )

...

CALL CLibF(C_LOC(SEND), SENDCOUNT, C_LOC(RECVCOUNTS))

...

Второй пример: вызов процедуры Фортрана из C. Код Фортрана:

SUBROUTINE SIM(ALPHA, BETA, GAMMA, DELTA, ARRAYS), BIND(C)

USE ISO_C_BINDING

IMPLICIT NONE

INTEGER (C_LONG), VALUE :: ALPHA

REAL (C_DOUBLE), INTENT(INOUT):: BETA

INTEGER (C_LONG), INTENT(OUT):: GAMMA

REAL (C_DOUBLE),DIMENSION(*),INTENT(IN) :: DELTA

TYPE, BIND(C) :: PASS

INTEGER (C_INT) :: LENC, LENF

TYPE (C_PTR):: C, F

END TYPE PASS

TYPE (PASS), INTENT(INOUT) :: ARRAYS

REAL (C_FLOAT), ALLOCATABLE, TARGET, SAVE :: ETA(:)

REAL (C_FLOAT), POINTER :: C_ARRAY(:)

...

! Связать указатель C_ARRAY с массивом, размещенным в C

CALL C_F_POINTER (ARRAYS%C, C_ARRAY, (/ARRAYS%LENC/) )

...

! Разместить массив и сделать его доступным C

ARRAYS%LENF = 100

ALLOCATE (ETA(ARRAYS%LENF))

ARRAYS%F = C_LOC(ETA)

...

END SUBROUTINE SIM

Описание структуры C: struct pass {int lenc, lenf; *c, float* f}

Прототип функции C:

void sim(long alpha, double *beta,

long *gamma,double delta[], struct pass *arrays)

Вызов в C: sim(alpha, &beta, &gamma, delta, &arrays);


next up previous contents
След.: Объектно-ориентированное программирование Выше: Средства взаимодействия с C Пред.: Взаимодействие глобальных данных   Содержание
Ilya A. Chernov 2012-12-19
X