next up previous contents
След.: Комассивы в процедурах Выше: Процедуры Пред.: Родовые интерфейсы и переопределение   Содержание


Оператор PROCEDURE и указатели на процедуры

Ключевое слово PROCEDURE служит для объявления указателей на процедуры, процедур-формальных аргументов других (процедур), а также внешних процедур. Синтаксис:

[MODULE] PROCEDURE([интрф])[атр]::имя[=>иниц] ,

где слово MODULE определяет модульную процедуру, атр -- атрибуты, включая INTENT, OPTIONAL, SAVE или POINTER, интрф -- имя интерфейса, процедуры, имеющей явный интерфейс, или имя типа. Интерфейс указывает на интерфейс процедур (подпрограмм или функций), которым могут быть связаны с указателем или фактическими параметрами. Если интерфейс абстрактный, то реальных процедур с таким интерфейсом может (пока) и не быть. Если указана процедура с явным интерфейсом (явно описанным или определяемым по описанию самой процедуры), то интерфейс возможных целей указателя или фактических параметров такой же, как у этой процедуры (в частности, она сама подходит на эти роли). Наконец, если указан тип, то подходят функции этого типа (то есть возвращающие значения этого типа). Если интерфейс опущен, то указатель имеет неявный интерфейс. Он определяет указатель на любую процедуру: подпрограмму или функцию.

Имя объявленной процедуры произвольно. Если присутствует оператор инициализации =>, то должен быть указан атрибут POINTER, но этот атрибут не требует обязательной инициализации. Он определяет указатель на процедуру. Если имеется инициализация, то в качестве иниц указывается имя процедуры или NULL(). Примеры:

PROCEDURE(), POINTER:: P0 => NULL()

PROCEDURE(func), POINTER:: Pf => func

PRINT*, Pf()

!Эквивалентно PRINT*, func()

PROCEDURE(REAL), POINTER:: Pr => NULL()

Pr => REAL_FUNC

Указатель на процедуру может иметь атрибут SAVE. Остальные атрибуты относятся к процедурам-формальным аргументам процедур и имеют тот же смысл, что и одноименные атрибуты обычных формальных параметров.

Приведем пример определения двух функций с родовым именем. Создадим модуль

MODULE FM

INTERFACE F

MODULE PROCEDURE FI, FR

END INTERFACE

CONTAINS

SUBROUTINE FI(A)

INTEGER A

PRINT*, "Целое", A

END SUBROUTINE

SUBROUTINE FR(A)

REAL A

PRINT*, "Вещественное", A

END SUBROUTINE

ENDMODULE

а в программе есть оператор USE FM. Тогда вызов CALL F(1) вызовет FI, а CALL F(7.40) вызовет FR.



Ilya A. Chernov 2012-12-19
X