ПАРАМЕТРЫ-ПРОЦЕДУРЫ И ПАРАМЕТРЫ-ФУНКЦИИ.

ПАРАМЕТРЫ-ПЕРЕМЕННЫЕ.

ПАРАМЕТРЫ-ЗНАЧЕНИЯ.

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

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

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

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

В качестве расширения стандартного Pascal, Turbo Pascal позволяет рассматривать процедуры и функции как объекты, которые можно присвоить переменным и которые могут выступать в качестве параметров; процедурные типы делают это возможным.

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

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

- они должны быть объявлены с директивой far (использование дальнего типа вызова подпрограмм) и откомпилированы в состоянии {$F+};

- они не должны быть:

стандартной процедурой или функцией;

вложенной процедурой или функцией;

inline процедурой или функцией;

interrupt процедурой или функцией.

При использовании параметров-процедур или параметров-функций в списке перед соответствующими формальными параметрами указывается зарезервированное слово procedureили function, например:

 

Procedure exm(k,l:integer; var m:real; procedure prob; function st:real);

 

В списке формальных параметров процедуры exm:

k, l – параметры-значения;

m - параметр-переменная;

prob – параметр-процедура;

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

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

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