Список формальных параметров <список форм. параметров> при описании процедуры или функции необязателен и может отсутствовать. Если же он есть, то в нем должны быть перечислены имена формальных параметров и их типы, например:
(пар1:тип1, ..., парK:типK; var парL:типL, ..., парM:типM;
const парP:типP, ..., парN:типN;)
Операторы тела подпрограммы рассматривают список формальных параметров как своеобразное расширение раздела описаний: все переменные из этого списка могут использоваться в любых выражениях внутри подпрограммы.
Любой из формальных параметров подпрограммы может быть либо параметром-значением, либо параметром-переменной (после слова var), либо, параметром-константой (после слова const).
Параметр-значение. Если параметр определен как параметр-значение, то перед вызовом подпрограммы это значение вычисляется, полученный результат копируется во временную память и передается подпрограмме. Даже если в качестве фактического параметра при вызове подпрограммы указана переменная или константы, все равно подпрограмме будет передана лишь копия переменной (константы). Любые возможные изменения в подпрограмме параметра-значения никак не воспринимаются вызывающей программой, так как в этом случае изменяется копия фактического параметра, а не само значение, подставляемое в команде вызова подпрограммы.
Параметр-переменная. Если параметр определен как параметр-переменная, то при вызове подпрограммы передается сама переменная, а не ее копия (фактически в этом случае подпрограмме передается адрес переменной). Изменение параметра-переменной приводит к изменению фактического параметра в вызывающей программе, т.е. той первоначальной переменной, подставляемой в команде вызова подпрограммы. Использование параметров-переменных по сути позволяет получать сразу несколько возвращаемых значений, причем как из функций так и из процедур.
Параметр-константа. В случае параметра-константы в подпрограмму также передается адрес области памяти, в которой располагается переменная или вычисленное значение. Однако любые присваивания параметру-константе нового значения в теле подпрограммы будут заблокированы.
Следует заметить, что если параметром подпрограммы является массив большой размерности, то существенные затраты времени и памяти на копирование при многократных обращениях к подпрограмме можно минимизировать, объявив этот параметр параметром-константой. Параметр-константа не копируется во временную область памяти, что сокращает затраты времени на вызов подпрограммы, однако любые его изменения в теле подпрограммы невозможны - за этим строго следит компилятор.
Нетипизированные параметры. В Object Pascal существует возможность использования нетипизированных параметров. Параметр считается нетипизированным, если тип формального параметра-переменной в заголовке подпрограммы не указан, при этом соответствующий ему фактический параметр может быть переменной любого типа. Нетипизированными могут быть только параметры-переменные.
Умалчиваемые параметры. В Object Pascal (начиная с версии Delphi 4) можно использовать умалчиваемые параметры. В списке формальных параметров <список форм. параметров> умалчиваемые параметры размещаются в конце в форме:
<имя_параметра>:<тип> = <значение_по_умолчанию>
где <имя_параметра>:<тип> – имя умалчиваемого параметра и его тип;
<значение_по_умолчанию> – значение параметра, которое он получает, если этот параметр не указывается (умалчивается) при вызове подпрограммы.
Если в подпрограмме используются несколько умалчиваемых параметров, то при обращении к такой подпрограмме нельзя пропускать значения всех умалчиваемых параметров перед последним, значение которого задается явно.
Например, для процедуры
ProcedureStudentEx (a:integer; b: real=2.3;
s:string = ’Ivanov’; k:integer=1);
следующие ее вызовы из программы являются правильными:
StudentEx(7, 3.6, ’Petrov’);
StudentEx(7, 2.3, ’Ivanov’, 2);
а следующие вызовы ошибочны:
StudentEx(7, , ’Petrov’);
StudentEx(7, 2.3, , 2);
Типом любого параметра в списке формальных параметров может быть только стандартный или ранее объявленный тип. Поэтому, например, следующее объявление процедуры неверно:
ProcedureStudentEx (a: array[1..10] of real);
Такое объявление следует осуществлять следующим образом:
Type
аТуре = array[1..10] of real;
ProcedureStudentEx (var a: аТуре);
Для передачи в подпрограмму одномерных массивов переменной длины в Object Pascal поддерживает так называемые открытые массивы.
Параметр - открытый массив представляет собой формальный параметр подпрограммы, описывающий базовый тип элементов массива, но не определяющий его размерности и границы, например:
ProcedureStudentEx (aOpen : array ofInteger);
Внутри подпрограммы такой параметр трактуется как одномерный массив с нулевой нижней границей и верхняя границей, возвращаемой стандартной функцией High.