Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
тема6.doc
Скачиваний:
4
Добавлен:
04.11.2018
Размер:
1.3 Mб
Скачать

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).

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]