Процедурные типы. Параметры-функции и параметры-процедуры.
Процедурные типы – это нововведение фирмы Borland (в стандартном Паскале таких типов нет). Основное назначение этих типов – дать программисту гибкие средства передачи функций и процедур в качестве фактических параметров обращения к другим процедурам и функциям.
Для объявления процедурного типа используется заголовок процедуры (функции), в котором опускается ее имя, например:
type Prod = Procedure (a, b, c: Real; var d: Real); Proc2 = Procedure (var a, b); Ргос3 = Procedure; Func1 = Function: String; Func2 = Function (var s: String): Real;
Как видно из приведенных примеров, существует два процедурных типа: тип-процедура и тип-функция.
Пример 8.3 иллюстрирует механизм передачи процедур в качестве фактических параметров вызова. Программа выводит на экран таблицу двух функций:
sin1(х) = (sin(x) + 1) * ехр(-х) cos1(x) = (cos(x) + 1) * exp(-x).
Вычисление и печать значений этих функций реализуются в процедуре PRINTFUNC, которой в качестве параметров передаются номер позиции N на экране, куда будет выводиться очередной результат (с помощью этого параметра реализуется вывод в две колонки), и имя нужной функции.
Пример 8.3.
Uses CRT; type Func = Function (x: Real): Real; {----------------} Procedure PrintFunc (XPos: Byte; F:Func); {Осуществляет печать функции F. (XPos – горизонтальная позиция начала вывода) } const np = 20; {Количество вычислений функций} var х: Real; i: Integer; begin {PrintFunc} for i: = 1 to np do begin x: = i * (2 * pi / np); GotoXY (XPos, WhereY); WriteLn (x:5:3, F(x):18:5) end end; {PrintFunc} {-----------------} Function Sin1fx: Real): Real; far; begin sinl: = (sin(x) + 1) * exp(-x) end; Function Cos1(x: Real): Real; far; begin cosl: = (cos(x) + 1) * exp(-x) end; {---------------} begin {основная программа} ClrScr; {Очищаем экран} PrintFunc (1, sin1); GotoXY (1.1); {Переводим курсор в левый верхний угол} PrintFunc (40, cos1) end.
Обратите внимание: для установления правильных связей функций SIN1 и COS1 с процедурой PRINTFUNC они должны компилироваться с расчетом на дальнюю модель памяти. Вот почему в программу вставлены стандартные директивы FAR сразу за заголовками функций. В таком режиме должны компилироваться любые процедуры (функции), которые будут передаваться в качестве фактических параметров вызова.