НЕТИПИЗИРОВАННЫЕ

. . . . .

. . . . .

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) трактуется Турбо Паскалем как обращение к значению функции, в то время как имя функции без списка параметров рассматривается как имя функции.
В отличие от стандартного Паскаля, в Турбо Паскале разрешается использовать в передаваемой процедуре (функции) любые типы параметров: параметры-значения, параметры-переменные, параметры-константы (в стандартном Паскале только параметры-значения).