Читайте также:
|
|
Для объявления процедурного типа используется заголовок процедуры (функции), в котором опускается ее имя, например:
Type Prod = Procedure (a, b, c: Real; var d: Real);
Proc2 = Procedure (var a, b);
РгосЗ = Procedure;
Func1 = Function: String;
Func2 = Function (var s: String): Real;
Как видно из приведенных примеров, существует два процедурных типа: тип-процедура и тип-функция.
Пример 5.4 иллюстрирует механизм передачи процедур в качестве фактических параметров вызова. Программа выводит на экран таблицу двух функций:
sin1(х) = (sin(x) + 1) * ехр(-х)
cos1(x) = (cos(x) + 1) * exp(-x).
Вычисление и печать значений этих функций реализуются в процедуре PRINTFUNC, которой в качестве параметров передаются номер позиции N на экране, куда будет выводиться очередной результат (с помощью этого параметра реализуется вывод в две колонки), и имя нужной функции.
Пример 5.4
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 Sin1(x: Real): Real;
begin
sinl:= (sin(x) + 1) * exp(-x)
end;
Function Cos1(x: Real): Real;
begin
cosl:= (cos(x) + 1) * exp(-x)
end;
{---------------}
begin {основная программа}
ClrScr; {Очищаем экран}
PrintFunc (1, sin1); GotoXY (1,1); {Переводим курсор в левый верхний угол}
PrintFunc (40, cos1)
end.
Стандартные процедуры (функции) Турбо Паскаля не могут передаваться рассмотренным способом.
В программе могут быть объявлены переменные процедурных типов, например, так:
var
p1: Proc1;
f1, f2: Func2;
р: array [1..N] of Proc1;
Переменным процедурных типов допускается присваивать в качестве значений имена соответствующих подпрограмм. После такого присваивания имя переменной становится синонимом имени подпрограммы, например:
Type Proc = Procedure (n: word; var a: Byte);
Var ProcVar: Proc; x, у: Byte;
Procedure Procl(x: word; var y: Byte); far;
begin
if x > 255 then у:= x mod 255
else у:= Byte(x)
end;
begin {Главная программа}
ProcVar:= Proc1;
for x:= 150 to 180 do
begin
ProcVar (x + 100, y);
Write (y:4)
end
end.
Разумеется, такого рода присваивания допустимы и для параметров-функций, например:
Type FuncType = Function (i: Integer): Integer;
Var VarFunc: FuncType;
i: Integer;
Function MyFunc (count: Integer): Integer; far;
begin
.......
end; {MyFunc}
begin {Основная программа}
.......
i:= MyFunc(1); {Обычное использование результата функции}
.......
VarFunc:= MyFunc;
{Присваивание переменной процедурного типа имени функции MyFunc}
.......
end.
Отметим, что присваивание VarFunc:= MyFunc(1);
будет недопустимым, так как слева и справа от знака присваивания используются несовместимые типы: слева - процедурный тип, а справа - INTEGER; имя функции со списком фактических параметров MyFunc(1) трактуется Турбо Паскалем как обращение к значению функции, в то время как имя функции без списка параметров рассматривается как имя функции.
В отличие от стандартного Паскаля, в Турбо Паскале разрешается использовать в передаваемой процедуре (функции) любые типы параметров: параметры-значения, параметры-переменные, параметры-константы (в стандартном Паскале только параметры-значения).
Дата добавления: 2015-07-26; просмотров: 63 | Нарушение авторских прав
<== предыдущая страница | | | следующая страница ==> |
Параметры-массивы и параметры-строки | | | Нетипизированные параметры-переменные |