Система программирования Turbo Pascal

           

Обратите внимание: для установления правильных



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

Содержание раздела