next up previous contents
След.: Родовые интерфейсы и родовые Выше: Интерфейсы Пред.: Понятие интерфейса   Содержание


Определение интерфейса

Интерфейс процедуры определяется словом FUNCTION или SUBROUTINE и спецификацией формальных аргументов и результата функции. Эти операторы могут иметь место в определении процедуры и/или в теле интерфейсного блока. Интерфейсный блока не может опписывать процедур, которая и так имеет явный интерфейс: внутреннюю процедуру, модульную процедуру из другого модуля и внутреннюю процедуру. Однако имя процедуры может фигурировать в операторе PROCEDURE в теле интерфейсного блока.

Интерфейсный блок имеет вид

[ABSTRACT] INTERFACE [специф]

тело

END INTERFACE [специф]

Тело интерфейса содержит объявления процедур -- подпрограмм и функций, а также декларация модульных и внешних процедур. Подпрограммы и функции описываются так:

FUNCTION имя(список параметров)

описательная часть: объявления параметров и результата функции

END FUNCTION

Слово FUNCTION заменяется словом SUBROUTINE, если описывается подпрограмма (в этом случае результат, разумеется, не объявляется).

Практически удобно, что описание процедуры в интерфейсе совпадает с реальным описанием процедуры, в котором опущены выполняемые операторы и объявления локальных данных. Впрочем, имена формальных аргументов могут отличаться.

Декларация процедур осуществляется с помощью слова PROCEDURE:

[MODULE] PROCEDURE [::] список имен

Так определяются указатели на процедуры, внешние процедуры, процедуры, являющиеся формальными аргументами и модульные процедуры с этим же родовым интерфейсом.

Слово ABSTRACT и специф не могут присутствовать вместе. В первом случае описывается абстрактный интерфейсный блок, то есть соответствующие ему процедуры могут (пока) не существовать. Он нужен, в частности, для объявления указателей на процедуры. Интерфейсный блок с указанием специф является родовым. Если отсутствуют оба, интерфейсный блок конкретный.

Родовой и конкретный интерфейсные блоки обеспечивают явный интерфейс и атрибут EXTERNAL для процедур. Если имя процедуры совпадает с именем формального аргумента процедуры, содержащей интерфейсный блок, то процедура является формальным аргументом, в противном случае она внешняя.

Спецификация специф может быть: родовым именем (общее имя для группы процедур, которое указывается при обращении к процедуре, причем конкретная процедура выбирается по числу и типу фактических аргументов), объявление оператора выражения OPERATOR(символ оператора), присваивания ASSIGNMENT(=) или оператора чтения READ(фмт) и записи WRITE(фмт), где фмт -- FORMATTED или UNFORMATTED. Об определении операторов (перегрузке) см. ниже, а также § 15.

Для стерильных процедур следует указывать атрибуты INTENT для всех аргументов, кроме указателй и процедур. Имена в опрераторе PROCEDURE должны иметь явный интерфейс и не относиться к встроенным процедурам. При этом они не должны ранее объявляться в интерфейсных блоках. Если присутствует слово MODULE, все указанные процедуры должны быть модульными.

Вот пример интерфейса:

INTERFACE

FUNCTION DETERMINANT(M)

REAL, DIMENSION(:,:):: M

REAL :: DETERMINANT

END FUNCTION

END INTERFACE

Еще пример [14]:

INTERFACE

SUBROUTINE EXT1 (X, Y, Z)

REAL, DIMENSION (100, 100) :: X, Y, Z

END SUBROUTINE EXT1

SUBROUTINE EXT2 (X, Z)

REAL X

COMPLEX (KIND = 4) Z (2000)

END SUBROUTINE EXT2

FUNCTION EXT3 (P, Q)

LOGICAL EXT3

INTEGER P (1000)

LOGICAL Q (1000)

END FUNCTION EXT3

END INTERFACE

Здесь явный интерфейс предоставляется конкретным блоком трем процедурам EXT1, EXT2 и EXT3. При вызове можно использовать ключевые аргументы:

PRINT*, EXT3(Q = P_MASK(N+1 : N+1000), P = ACTUAL_P)

Существует оператор IMPORT, применяемый в интерфейсных блоках: он позволяет использовать в них то, что определено в объемлющей области видимости (иначе невидимое). Может содержать список импортируемых имен (возможно, отделенных символом ::).



Ilya A. Chernov 2012-12-19
X