
Механизм передачи параметров
Как было показано в приведенных выше примерах программ с использованием процедур и функций, в заголовке процедуры или функции может быть задан список параметров, которые называются формальными. Название "формальные" эти параметры получили в связи с тем, что в этом списке заданы только имена для обозначения исходных данных и результатов работы процедуры, а при вызове подпрограммы на их место будут подставлены конкретные значения (выражений) й имен. Этот список указывается после имени подпрограммы и заключается в круглые скобки.
Список формальных параметров, указываемых в заголовке подпрограммы, может включать в себя:
параметры-значения;
параметры-переменные, перед которыми должно стоять служебное слово var и за которыми указывается их тип;
параметры-процедуры, перед которыми должно стоять служебное слово procedure;
параметры- функции, перед которыми должно стоять служебное слово function и после которых указывается тип значения, возвращаемого функцией в основную программу;
нетипизированные параметры, перед которыми должно стоять служебное слово var и отсутствует указание типа.
Параметры-значения
Заголовок процедуры с описанными параметрами-значениями имеет такой вид:
procedure MyProc ( Parl, Par2 : Typel; РагЗ, Раг4 : Туре2 );
Механизм работы параметров-значений упрощенно можно представить такой схемой:
В качестве фактического параметра-значения могут использоваться как переменные, так и константы различных типов. Не допускаются только файловые типы и типы, опирающиеся на файловый.
Параметры-переменные
Заголовок процедуры с описанными параметрами-переменными имеет такой вид:
procedure MyProc ( var Parl, Раг2 : Typel; var РагЗ, Раг4 : Туре2 );
Механизм работы параметров-переменных упрощенно можно представить такой схемой:
В качестве фактического параметра-переменной могут использоваться переменные любых типов, включая файловые и опирающиеся на файловый, но зато использование констант не допускается.
Параметры-процедуры и параметры-функции. В качестве расширения стандартного Паскаля, Турбо Паскаль позволяет рассматривать процедуры и функции как, объекты, которые можно присвоить переменным и которые могут выступать в качестве параметров; процедурные типы делают это возможным.
Как только процедурный тип определен, можно объявлять переменные этого типа. Такие переменные называются процедурными переменными. Они могут быть использованы в качестве формальных параметров при вызове процедур и функций. Подобно тому, как целочисленной переменной можно присвоить целочисленное значение, процедурной переменной можно присвоить процедурное значение. Такое значение может, конечно, быть и другой процедурной переменной, но может также быть идентификатором процедуры или функции. В этой ситуации объявление процедуры или функции можно рассматривать как особый вид объявления константы, значением которой является процедура или функция.
Как и во всех других операциях присваивания, переменная в левой части и переменная в правой части оператора присваивания должны быть совместимыми по присваиванию. Для того чтобы считаться совместимыми по присваиванию, процедурные типы должны иметь одинаковое число параметров, параметры в соответствующих позициях должны быть тождественных типов; наконец, типы результатов функций должны быть идентичны. Дополнительно к совместимости типов процедура или функция должны удовлетворять следующим требованиям, если они присваиваются процедурной переменной.
Они должны быть объявлены с директивой far (использование дальнего типа вызова подпрограмм) и откомпилированы в состоянии {$F+};
Они не должны быть:
стандартной процедурой или функцией;
вложенной процедурой или функцией;
inline процедурой или функцией;
interrupt процедурой или функцией.
При использовании параметров-процедур или параметров-функций в списке перед соответствующими формальными параметрами указывается зарезервированное слово procedure или function, например:
procedure Exampl (К,L: integer; var M : real; procedure Prob; function Step: real) ;
В списке формальных параметров процедуры Exampl: К, L — параметры-значения; М — параметр-переменная; Prob — параметр-процедура; Step — параметр-функция, результатом выполнения которой будет значение вещественного типа.
При вызове подпрограммы на место формальных параметров-процедур и параметров-функций осуществляется подстановка имен соответствующих фактических процедур или функций. При этом, если процедуры и функции, фигурирующие в качестве фактических параметров, имеют, в свою очередь, параметры, они могут быть только параметрами-значениями.
Параметры процедурного типа особенно полезны в ситуациях, когда над множеством процедур или функций выполняются общие действия. Примером использования параметров-функций может служить программа, которая с помощью одной и той же процедуры печати таблицы выводит на экран три таблицы арифметических функций (сложения, умножения и произведения суммы на разность чисел), каждая из которых выполняется отдельной функцией,
program Demo_Tabl;
(Описание процедурного типа Func — целой функции двух аргументов целого типа}
type
Func = function(X,X : integer) : integer;
{$F+} {Директива компилятору на использование дальнего типа вызова подпрограмм}
{Описание функции сложения двух целых чисел}
function Add(X,Y : integer) : integer;
begin
Add:=X +Y;
end;
{Описание функции умножения двух целых чисел)
function Mult(X,Y : integer) : integer;
begin
Mult:=X*Y;
end;
{Описание функции умножения суммы на разность двух целых чисел)
function Funny(X,У : integer) : integer;
begin
Funny : = (X+Y) * (X-Y) ,• end;
{$F-}
{Описание процедуры вывода на экран таблицы для двух чисел от 1 до 10, вид арифметической операции задается значением параметра-функции Operation)
procedure Type_Tabl(W,H : integer; Operation': Func);
var
X,Y : integer;
begin
for Y:=l to H do
begin
for X:=l to W do
Write(Operation(X,Y):5);
Writeln;
end;
end;
Begin
{Начало главной программы)
Туре_Таbl(10,10,Add) ; {Вызов процедуры для печати таблицы сложения }
Туре_Таbl(10,10,Mult) ; {Вызов процедуры для печати таблицы умножения)
Туре_Таbl(10,10,Funny);{Вызов процедуры для печати таблицы произведений суммы чисел от 1 до 10 на их разность)
end.
Примечание. {SF+} — указание (директива) компилятору Турбо Паскаль на использование дальнего (for) типа вызова для корректной обработки вызова процедуры ТуреТаbl параметрами-функциями.
В данной программе процедура ТуреТаbl представляет собой общее действие, выполняемое над параметрами-функциями Add, Mult, Funny. После запуска программы сначала вызывается процедура ТуреТаbl для фактических параметров 10, 10 и Add, в результате чего формальным параметрам X и Y присваиваются значения чисел 10 и 10, а формальному параметру Operation процедурного типа Func присваивается имя фактической функции Add. В результате этого на экран будет выведена таблица сложения от 1 до 10. Затем процедура ТуреТаbl вызывается к исполнению для фактических параметров 10, 10 и'параметра-функции Mult, в результате чего на экран будет выведена таблица умножения от 1 до 10. Аналогично вызов процедуры Туре_Таbl с параметрами 10, 10 и Funny даст в результате на экране таблицу произведения суммы на разность чисел от 1 до 10.