Процедура подпрограмма

Кроме функций, существует второй вид процедур – подпрограммы. Они являются более универсальными программными компонентами, т.к. могут возвращать в основную программу не только значения вычислений, но и осуществлять определенные действия (например, выполнять специальные операции ввода-вывода, обрабатывать массивы и пр.). Подпрограммы бывают внутренние и внешние.

Структура подпрограммы имеет следующий вид:

SUBROUTINE < имя подпрограммы>([< форм.арг >])

< объявление форм.арг >

< объявление локальных объектов >

< вычисляемые операторы, присваивание результата >

END [ SUBROUTINE [ < имя подпрограммы > ] ]

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

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

Рассмотрим пример программы, выводящей рамку с сообщениями.

program ramka

character(12) s

s=’ ATTENTION ’; call message(s)

write(*,*)

s=’ stop ’

Contains

subroutine message(text)

character(12) text

write(*,*)’********************’

write(*,*)’* ’,s,’ *’

write(*,*)’********************’

end subroutine message

end

Результат работы программы

********************

* ATTENTION *

********************

********************

* STOP *

********************

Формальные и фактические параметры подпрограмм и функций

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

При вызове процедуры между фактическими и формальными параметрами устанавливается соответствие (формальные параметры ассоциируются с соответствующими фактическими).

Для того, чтобы сделать доступными какие-то данные процедуре, их надо передать в списке параметров, который стоит сразу за именем подпрограммы в скобках:

subroutine PrеValues (a,b,c).

Параметры, записанные в заголовке подпрограммы, называются формальными параметрами (аргументами). Для подпрограммы это просто переменные. Параметры, подставленные в месте вызова подпрограммы, называются фактическими параметрами. В качестве фактических параметров могут быть константы, переменные или (неявные) результаты выражений.

subroutine PrеValues(a,b,c)! имя подпрограммы

! описание переменных – формальных параметров

integer a,b

real c

!

print *,’a= ‘,a

print *,’b= ‘,b

print *,’c= ‘,c

End

В подпрограмму PrеValues(a,b,c) передаются значения 3-х переменных, которые и печатаются. Формальные параметры – переменные, существующие ТОЛЬКО в подпрограмме. Они ВИДНЫ ТОЛЬКО в подпрограмме. Если вне подпрограммы есть переменные с такими же именами, они не имеют ничего общего!

Вызов этой подпрограммы может выглядеть так:

integer a1/4/,a2/7/

real pi/3.14159

call PrеValues(1,2,7.)! 1 2 7.

call PrеValues(1,2.,7.)! ERROR!

При первом вызове подпрограммы в переменную (форм. пар-ер) а будет положено значение из переменной a1(4), в b – из a2 (7), в c – из pi (3.14…). Соответственно подпрограмма и распечатает их в таком виде:

a=1

b=2

c=7.

Почему неправильный последний пример? Интерфейс подпрограммы предписывает, что подпрограмма ДОЛЖНА вызываться с 3-мя фактическими параметрами, имеющими соответствующий тип. Соответственно она и распределяет память. Если вызвать с фактическими параметрами, имеющими другой тип, значение положится в вызывающей программе в память по одному, а внутри подпрограммы будет взято из той же памяти по другому. Результат становится полностью не определен! Отсюда вытекает следующее правило:

Список формальных и фактических параметров должен совпадать по количеству и характеристикам аргументов.

Другими словами, сколько параметров описано в заголовке подпрограммы, столько же должно стоять в операторе вызова (за некоторыми исключениями), тип и длина каждого фактического параметра должны совпадать с типом и длиной соответствующего по порядку формального (рис.6.1)

Рис. 6.1 Соответствие между формальными и фактическими параметрами

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

subroutine Sum(a,b,c)

real a,b,c

c=a+b

return

end

call Sum(1.,3.,s)

В переменную s поместится результат сложения фактических параметров – констант 1 и 3. Важно обратить внимание, что если формальный параметр в подпрограмме является [in] – входящим (вводящим значение в подпрограмму), то в качестве фактического параметра может быть переменная или константа (первые 2 параметра Sum). Если же формальный параметр в подпрограмме является [out], или [in/out] – выходящим (возвращающем значение из подпрограммы), то в качестве фактического параметра может быть только переменная (3 параметр Sum).


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: