next up previous contents
След.: Перечисления Выше: Средства взаимодействия с C Пред.: Взаимодействующие встроенные типы   Содержание

Указатели

Работа с указателями C, которые, по сути, содержат адреса объектов в памяти, предусмотрены производные типы C_NULL_PTR и C_NULL_FUNPTR для пустых указателей C. Также имеются процедуры:

C_LOC(X) -- справочная функция, возвращающая адрес объекта X, который может быть: переменной взаимодействующего типа, с атрибутом TARGET, которая либо сама взаимодействующая, либо размещенная размещаемая, либо указатель, связанный с объектом; неполиморфным скаляром без параметров длины, с атрибутом TARGET, либо размещенным размещаемым, либо указателем, связанным с объектом.

C_FUNLOC(X) -- справочная функция, возвращающая адрес процедуры. При этом X является взаимодействующей процедурой или указателем на таковую.

C_ASSOCIATED(C_PTR1[,C_PTR2]) -- справочная функция, принимающая один или два указателя (на объекты или процедуры). Возвращает ложное логическое значение, если первый аргумент -- нулевой указатель и если второй аргумент есть и имеет отличное от первого значение.

C_F_POINTER(CPTR,FPTR[,SHAPE]) -- подпрограмма перевода указателей C в указатели Фортрана. Первый аргумент (входящий) -- указатель C на взаимодействующий объект, совместимый по типу и разновидности типа со вторым аргументом. Не допускается указатель на объект Фортрана без атрибута TARGET. Второй аргумент -- указатель Фортрана, который связывается с объектом, адрес которого задан первым аргументом. Если это массив, его конфигурацию определяет третий аргумент, который является необязательным входящим и массивом ранга один. Его размер совпадает с рангом второго аргумента. Если это массив, аргумент обязан присутствовать.

C_F_PROCPOINTER(CPTR,FPTR) -- подпрограмма перевода указателей C в указатели на процедуры Фортрана. Первый аргумент (входящий) -- имеет тип C_FUNPTR и содержит адрес взаимодействующей процедуры. Второй аргумент -- указатель на процедуру, который связывается с соответствующей процедурой.

C_SIZEOF(X) -- справочная функция, возвращающая размер объекта в байтах. Аргумент -- взаимодействующий, и не массив, перенимающий размер. Результат -- целый разновидности C_SIZE_T. Для скаляров -- равен результату оператора sizeof компилятора C применительно к совместимому объекту. Для массивов результат для одного элемента умножается на число элементов.

Таков механизм передачи динамических массивов между двумя языками. Цель указателя Фортрана или массив, перенимающий конфигурацию, не могут быть переданы в C, так как их элементы не обязательно последовательно находятся в памяти. Однако размещенный размещаемый массив может передаваться в C, а размещенный в C массив может стать целью указателя Фортрана. C может получить также адрес невзаимодействующего объекта Фортрана посредством функции C_LOC.

Пример применения C_LOC и C_ASSOCIATED [14]:

USE, INTRINSIC :: ISO_C_BINDING, ONLY: C_PTR, C_FLOAT, C_ASSOCIATED, C_LOC

INTERFACE

SUBROUTINE FOO(GAMMA) BIND(C)

IMPORT _PTR

TYPE(C_PTR), VALUE :: GAMMA

END SUBROUTINE FOO

END INTERFACE

REAL(C_FLOAT), TARGET, DIMENSION(100) :: ALPHA

TYPE(C_PTR) :: BETA

...

IF (.NOT. C_ASSOCIATED(BETA)) THEN

BETA = C_LOC(ALPHA)

END IF

CALL FOO(BETA)



Ilya A. Chernov 2012-12-19
X