Основные типы параметров подпрограмм

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

Параметры подпрограмм

Подпрограммы могут быть с параметрами и без параметров, т.е. список параметров может отсутствовать. В подпрограммах без параметров можно использовать как глобальные, так и локальные объекты.

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

Все формальные параметры должны быть определены в списке формальных параметров заголовка подпрограммы под своими именами, известными в блоке процедуры или функции, а также определен тип параметров.

Примеры.

PROCEDURE MNMX ( A : REAL ; M : ITEGER ; VAR MN, MX : REAL ) ;

FUNCTION FACT ( B : MYTYPE ; N : INTEGER ) : INTEGER ;

MYTYPE - тип параметра, определенный пользователем.

MN, MX – параметры-переменные. A, B, M, N – параметры-значения.

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

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

 

Параметры-значения передаются основной программой в вызываемую подпрограмму через стек в виде их копий. Поэтому фактический параметр подпрограммой измениться не может.

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

Следовательно, входные параметры подпрограммы могут быть как параметрами-значениями, так и параметрами-переменными. Выходные же - только параметрами-переменными.

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

В версии 7.0 могут быть использованы параметры-константы, которые в подпрограммах не изменяются. Их объявление осуществляется по форме:

PROCEDURE P (CONST Par : WORD ) ;

Если в теле процедуры появится оператор:

P := <выражение> ;

то это вызовет диагностическое сообщение об ошибке. В качестве параметров-констант можно использовать параметры любого типа, простые и сложные.

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

FUNCTION EQUAL (VAR PARAM1, PARAM2; LEN : WORD ) ;

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

В качестве открытых параметров-переменных в языке Паскаль могут использоваться массивы и строки. Открытые массивы – это параметры-массивы подпрограмм, размер которых не указывается в списке формальных параметров заголовка подпрограммы:

FUNCTION SUM ( VAR A : ARRAY OF BYTE ) : BYTE ;

Ключевое слово VAR в объявлении параметра открытого типа обязательно.

Фактическим параметром открытого массива может быть массив любого размера. Тип элементов фактического массива должен совпадать с типом массива – формального параметра. В качестве открытых массивов могут использоваться только одномерные массивы. Внутри подпрограмм границы переданного массива могут определяться с помощью функций LOW (low (x) возвращает минимальное значение порядкового типа) и HIGH (high (x) возвращает максимальное значение порядкового типа). При этом результат вызова функции LOW всегда даст 0. А результат вызова функции HIGH – верхнее значение индекса при нумерации его элементов от 0.

Открытые строки аналогичны открытым массивам. Для их использования после объявления имени программы необходимо включить директиву {$P+}. Формальные параметры объявляются в виде string. В качестве фактических параметров при этом можно использовать строки любой длины. Внутри подпрограммы строка-параметр всегда трактуется по максимуму, т.е. как строка на 255 символов.

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

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

TYPE PROC1 = PROCEDURE ( A, B, C, : REAL ; VAR D : REAL ) ;

PROC2 = PROCEDURE ( VAR A, B, C, : REAL ) ;

PROC3 = PROCEDURE ; { процедура без параметров }

FUNC1 = FUNCTION ( S : STRING ) : REAL ;

FUNC2 = FUNCTION : STRING ; { без параметров }

В данном примере PROC1, PROC2, PROC3, FUNC1, FUNC2 - имена типов процедурных параметров, идентификаторы.

Использование подпрограмм, в которых в качестве формальных параметров применяются процедурные типы и в качестве фактических – имена подпрограмм, требует директивы компилятора {$f+} или опции компилятора OPTIONS / COMPILE / FORCE FAR CALLS – дальний вызов подпрограмм.