Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
BorlandPascal.doc
Скачиваний:
54
Добавлен:
17.03.2015
Размер:
2.83 Mб
Скачать

Процедурные значения

Переменной процедурного типа можно присвоить процедурное

значение. Процедурные значения могут быть следующими:

* значениями nil;

* ссылкой на переменную процедурного типа;

* идентификатором процедуры или функции.

В контексте процедурных значений описание процедуры или

функции можно рассматривать как специальный вид описаний конс-

тант, когда значением константы является процедура или функция.

Рассмотрим, например, следующее описание:

var

P: SwapProc;

F: MathFunc;

procedure Swap(var A, B: Integer); far;

var

Temp: Integer;

begin

Temp := A;

A := B;

B := Temp;

end;

function Tan(Angle: Real); far;

begin

Tan := Sin(Angle) / Cos(Angle);

end;

Переменным P и F можно присвоить значения следующим образом:

P := Swap;

F := Tan;

а вызовы с помощью P и F можно выполнить так:

P(I, J); { эквивалентно Swap(I, J) }

X := F(X); { эквивалентно X := Tan(X) }

Использование процедурных переменных, которым в операторе

вызова процедуры или функции присваивается значение nil, приводит

к ошибке. Значение nil предназначено для указания того, что про-

цедурная переменная не присвоена, и, так где процедурная перемен-

ная может получить значение nil, участвующие в этой процедурной

переменной вызовы процедур и функций следует подвергать проверке:

if @P <> nil then P(I, J);

Обратите внимание на использование операции @ для указания

того, что P проверяется, а не вызывается.

Совместимость типов

Чтобы они считались совместимыми, процедурные типы должны

иметь одно и то же число параметров, а параметры в соответствую-

щих позициях должны иметь тождественные типы. При определении

совместимости процедурных типов имена параметров значения не име-

ют. Значение nil совместимо с любым процедурным типом.

Чтобы использоваться в качестве процедурных значений, проце-

дуры и функции должны описываться с директивой far и компилиро-

ваться в состоянии с {$F+}. Кроме того, в качестве процедурных

значений не могут указываться стандартные процедуры и функции,

вложенные процедуры и функции, методы, процедуры и функции, опи-

санные с ключевым словом inline или interrupt.

Стандартные процедуры и функции - это подпрограммы, описан-

ные в модуле Unit, например, WriteLn, ReadLn, Chr или Ord. Чтобы

использовать в качестве процедурного значения стандартную проце-

дуру и функцию, напишите для нее "оболочку". Например, следующая

функция DSin совместима по присваиванию с описанным выше типом

MathFunc:

function FSin(X: Real): Real; far;

begin

FSin := Sin(X);

end;

Процедура или функция является вложенной, когда она описыва-

ется внутри другой процедуры или функции. Такие вложенные проце-

дуры и функции не могут использоваться в качестве процедурных

значений.

Соседние файлы в предмете Программирование на Pascal