НЕТИПИЗИРОВАННЫЕ
. . . . .
. . . . .
Begin
Var
Type
End
Begin
Else
Begin
Var
Type
Var
Begin
Begin
End
Begin
Var
Const
np = 20 {Количество вычислений функций}
x: real;
i: integer;
begin {PrintFunc}
for i := 1 to np do
x := i * (2 * pi / np);
GotoXY (XPos, WhereY);
WriteLn (x:5:3, F(x):18:5)
end {PrintFunc}
{----------}
Function Sin1(x: real): real; far;
sin1 := (sin(x) + 1) * exp(-x)
end;
{----------}
Function Cos1(x: real): real; far;
cos1 := (cos(x) + 1) * exp(-x)
end;
{----------}
begin {основная программа}
ClrScr; {Очищаем экран}
PrintFunc (1, sin1);
GotoXY (1,1); {Переводим курсор в левый верхний угол}
PrintFunc (40, cos1)
end.
Обратите внимание: для установления правильных связей функций SIN1 и COS1 с процедурой PRINTFUNC они должны компилироваться с расчетом на дальнюю модель памяти. Вот почему в программу вставлены стандартные директивы FAR сразу за заголовками функций. В таком режиме должны компилироваться любые процедуры (функции), которые будут передаваться в качестве фактических параметоов вызова.
Стандартные процедуры (функции) Турбо Паскаля не могут передаваться рассмотренным способом. В программе могут быть объявлены переменные процедурных типов, например, так:
pi: Proc1;
f1, f2: Func2;
ар: array [1..N] of Proc1;
Переменным процедурных типов допускается присваивать в качестве значений имена соответствующих подпрограмм. После такого присваивания имя переменной становится синонимом имени подпрограммы, например:
Proc = Procedure (n: word; var a: byte);
ProcVar: Proc;
x, у: byte;
Procedure Proc1(x: word; var y: byte); far;
if x > 255 then
y := x mod 255
у := byte(x)
end;
begin {Главная программа}
ProcVar := Proc1;
for x := 150 to 180 do
ProcVar (x + 100, у);
Write (у:8)
end.
Разумеется, такого рода присваивания допустимы и для параметров-функций, например:
FuncType = Function (i: integer): integer;
VarFunc: FuncType;
i: integer;
Function MyFunc (count: integer): integer; far;
. . . . .
end; {MyFunc}
begin {Основная программа}
i := MyFunc(1); {Обычное использование результата функции}
VarFunc := MyFunc; {Присваивание переменной процедурного типа
имени функции MyFunc}
end.
Отметим, что присваивание
VarFunc := MyFunc(1);
будет недопустимым, так как слева и справа от знака присваивания используются несовместимые типы: слева -- процедурный тип, а справа -- INTEGER; имя функции со списком фактических параметров MyFunc(1) трактуется Турбо Паскалем как обращение к значению функции, в то время как имя функции без списка параметров рассматривается как имя функции.
В отличие от стандартного Паскаля, в Турбо Паскале разрешается использовать в передаваемой процедуре (функции) любые типы параметров: параметры-значения, параметры-переменные, параметры-константы (в стандартном Паскале только параметры-значения).