6.4 Формальные и фактические параметры подпрограмм и функций
Обмен данными между процедурой и вызывающей программной единицей может быть выполнен через параметры процедуры. Параметры, используемые при вызове процедуры, называются фактическими. Параметры, используемые в процедуре, называются формальными.
При вызове процедуры между фактическими и формальными параметрами устанавливается соответствие (формальные параметры ассоциируются с соответствующими фактическими).
Для того, чтобы сделать доступными какие-то данные процедуре, их надо передать в списке параметров, который стоит сразу за именем подпрограммы в скобках:
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).