2.11. Подпрограммы SUBROUTINE, FUNCTION и INTERFACE

В языке FORTRAN так же, как в языке PASCAL, есть подпрограммы-процедуры (SUBROUTINE) и подпрограммы-функции (FUNCTION). Оператор заголовка процедуры имеет вид:

SUBROUTINE имя процедуры(параметр[[атрибуты]][,...]) параметр - это или имя параметра (допускаются параметры - переменные, мас­сивы и подпрограммы), или символ *. Тип параметра в операторе SUBROUTINE не указывается; если это необходимо, параметры описываются внутри процеду­ры. Процедура заканчивается оператором END и располагается вне любой дру­гой подпрограммы и главной программы так же, как в языке C. Подпрограммы могут находиться в том же файле, что и главная программа, или в других файлах. Процедура вызывается в главной программе или в другой подпрограмме специ­альным оператором вызова CALL:

CALL имя(список аргументов)

Рекурсия в языке FORTRAN запрещена. Количество и типы аргументов в операторе CALL должны точно соответствовать количеству и типам параметров в операторе SUBROUTINE. Все параметры по умолчанию передаются в проце­дуры по адресу, это означает, что все действия над параметрами в процедуре фактически осуществляются над аргументами. Чтобы передать аргумент по зна­чению, необходимо в операторе SUBROUTINE для соответствующего парамет­ра задать атрибут VALUE. Атрибуты задаются в квадратных скобках после име­ни параметра. Параметр процедуры может быть массивом любой размерности. Такой параметр должен быть обязательно описан внутри процедуры. В описании измерений массива-параметра можно использовать не только константы, но и параметры-переменные данной процедуры, что позволяет записывать процеду­ры, которые могут обрабатывать массивы переменного размера. Кроме того, раз­решается верхнюю границу последнего измерения параметра-массива задавать символом *. Если предполагается, что нижняя граница индекса всегда равна 1, то одномерный массив-параметр описывается в виде имя(*). Параметры-массивытакже можно объявлять с атрибутом VALUE, но в этом случае они не могут иметь переменный размер.

Параметрами процедур могут быть подпрограммы (процедуры и функции). Внутри процедуры такой параметр не нужно как-либо описывать, но в вызы­вающей программной единице соответствующий аргумент должен быть описан специальным образом. Если аргумент является именем стандартной функции, то он описывается в операторе

INTRINSIC список имен если это любая другая функция или процедура, то следует использовать оператор

EXTERNAL список имен Некоторые стандартные функции запрещено использовать в качестве аргумен­тов.

Формальным параметром процедуры может быть *. Аргументом, соответст­вующим такому параметру, должна быть конструкция * метка. Параметры такого типа используются следующим образом : внутри процедуры можно записывать любое количество операторов

RETURN

или

RETURN целое выражение Первый оператор приводит к завершению процедуры и передаче управления оператору, следующему за оператором CALL в вызывающей программной еди­нице. Второй оператор также завершает выполнение процедуры, но управление передается оператору с меткой, равной значению одного из аргументов. Значе­ние целочисленного выражения после RETURN определяет порядковый номер метки среди аргументов-меток. Например, программа SUBROUTINE A ( *,*,x,*,* )

INTEGER x IF(x.LT.0) RETURN 1 IF(x.EQ.0) RETURN 2

IF(x.LE.10) RETURN 3

RETURN 4 END

CALL A( *100,*200,5,*300,*400) STOP '0' 100    STOP '1'

200  STOP '2' 300  STOP '3' 400  STOP '4' END

выведет на экран символ 3.

Оператор заголовка подпрограммы-функции записывается в виде: [ тип] FUNCTION имя(список параметров)

Если тип функции явно не указан, он определяется правилами умолчания. Спи­сок параметров функции аналогичен списку параметров процедуры, но не допус­каются параметры - метки. Тип функции может быть целым, вещественным, комплексным, логическим и символьным. Если тип функции отличается от предполагаемого по умолчанию, то его нужно описать в вызывающей программ­ной единице. Список параметров функции может быть пустым, в этом случае в заголовке функции можно не записывать и ( ), но при вызове функции даже с пустым списком параметров список аргументов задается обязательно в виде ( ). Внутри функции необходимо присвоить имени функции возвращаемое значение, точно так же, как в языке PASCAL. Можно использовать оператор RETURN, но без параметра (так как запрещены параметры-метки).

Подпрограммы SUBROUTINE и FUNCTION, находящиеся в других файлах или в библиотеках, можно описать в специальных подпрограммах INTERFACE. Такое описание дает возможность компилятору проверить соответствие типов аргументов и параметров при вызове подпрограмм. Подпрограмма INTERFACE имеет следующую структуру :

INTERFACE TO заголовок процедуры или функции описания параметров

END

Подпрограмма INTERFACE должна находиться в том же файле, что и вызы­вающая программная единица.