Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
1 Информатика и программирование.doc
Скачиваний:
10
Добавлен:
01.03.2025
Размер:
327 Кб
Скачать
☆

13 Процедурный тип. Передача процедур и функций в качестве параметра.

Основное назначение процедурных типов – дать программисту гибкие средства передачи функций и процедур в качестве фактических параметров обращения к другим процедурам и функциям.

Для объявления процедурного типа используется заголовок процедуры (функции), в котором опускается ее имя, например:

Type

Proc1 = Procedure (var a, b);

Func1 = Function: string;

Итак, существует два процедурных типа: тип-процедура и тип-функция. Pascal не позволяет объявлять функции, возвращающие значения процедурного типа; результат функции должен быть String, Real, Integer, Char, Boolean, Pointer или перечисление.

В программе могут быть объявлены переменные процедурных типов:

var p1: Proc1;

f1, f2: Func1;

Переменным процедурных типов допускается присваивать в качестве значений имена соответствующих подпрограмм. После такого присваивания имя переменной становится синонимом имени подпрограммы.

Так как процедурные типы допустимы в любом контексте, то можно объявить процедуры или функции, параметрами которых являются процедуры или функции.

----------------

Например, программа выведения 2 таблиц различных арифметических операций:

program Tables;

type

Func = function(X, Y: Integer): Integer;

function Add(X, Y: Integer): Integer;

begin

Add := X + Y;

end;

Function Multiply(X, Y: Integer): Integer;

begin

Multiply := X * Y;

end;

procedure PrintTable(W, H: Integer; Operation: Func);

var

X, Y: Integer;

begin

for Y := 1 to H do

begin

for X := 1 to H do Write(Operation(X,Y ) : 5);

Writeln;

end;

Writeln;end;

begin

PrintTable(10, 10, Add);

PrintTable(10, 10, Multiply);end.

Параметры процедурного типа особенно полезны в ситуациях, когда над множеством процедур или функций выполняются общие действия. В нашем случае процедура PrintTable представляет общее действие, выполняемое над функциями Add и Multiply.

14 Директивы, используемые при описании процедур и функций.

Сразу за заголовком подпрограммы может следовать одна из стандартных директив Assembler, External, Far, Forward, Inline, Interrupt, Near. Эти директивы уточняют действия компилятора и распространяются на всю подпрограмму и только на нее, т.е. если за подпрограммой следует другая подпрограмма, стандартная директива, указанная за заголовком первой, не распространяется на вторую.

Assembler – эта директива отменяет стандартную последовательность машинных инструкций, вырабатываемых при входе в процедуру и перед выходом из нее. Тело подпрограммы в этом случае должно реализоваться с помощью команд встроенного ассемблера.

External – с помощью этой директивы объявляется внешняя подпрограмма.

Far – компилятор должен создавать код подпрограммы, рассчитанный на дальнюю модель вызова. Директива Near заставит компилятор создать код, рассчитанный на ближнюю модель памяти. По умолчанию все подпрограммы, объявленные в интерфейсной части модулей, генерируется с расчетом на дальнюю модель вызова, а все остальные подпрограммы – на ближнюю модель.

В соответствии с архитектурой микропроцессора ПК, в программах могут использоваться две модели памяти: ближняя и дальняя.

Модель памяти определяет возможность вызова процедуры из различных частей программы: если используется ближняя модель, вызов возможен только в пределах того же сегмента, при дальней модели вызов возможен из любого сегмента. Ближняя модель экономит один байт и несколько микросекунд на каждом вызове подпрограммы, поэтому стандартный режим компиляции предполагает эту модель памяти. Однако при передаче процедурных параметров, а также в оверлейных модулях соответствующие подпрограммы должны компилироваться с расчетом на универсальную – дальнюю – модель памяти, одинаково пригодную при любом расположении процедуры и вызывающей ее программы в памяти.

Forward – используется при опережающем описании для сообщения компилятору, что описание подпрограммы следует где-то дальше по тексту программы (но в пределах текущего программного модуля).

Inline – указывает на то, что тело подпрограммы реализуется с помощью встроенных машинных инструкций.

Interrupt – используется при создании процедур обработки прерываний.