Процедурные типы
Процедуры в Паскале разрешается использовать при описании новых типов. На основании таких типов, обладающих равными правами с другими типами, можно описывать переменные, что позволяет передавать подпрограммы в качестве параметров. Подобный прием в некоторых случаях помогает эффективно решить сложную задачу, с трудом поддающуюся кодированию обычным способом, однако пользоваться им нежелательно, по крайней мере начинающим разработчикам. Примеры:
typeTSumFun = function( А, В: Integer ): Integer;
TEmptyProc = procedure;
TMyProc = procedure( X: Real );
varSumP: TSumFun;
EmptyProc: TEmptyProc;
MyPr: TMyProc;
Далее, если в тексте описана подпрограмма, то ее можно присвоить переменной соответствующего типа:
SumP := Sum;
EmptyProc := Demo;
Для обращения к нужной подпрограмме теперь можно указывать не только ее имя, но и имя переменной, хранящей «описание» этой подпрограммы:
X := SumP( 2,2 );
Реально здесь произойдет вызов функции Sum с аргументами 2 и 2.
Подпрограмму можно передавать в другую подпрограмму как параметр. Это удобно, когда над аргументами надо выполнять различные сложные действия в зависимости от некоторых условий. В приведенном ниже примере функция MathAction будет вычислять или сумму, или разность параметров, в зависимости от того, какая функция указана в качестве параметра.
type TMathFun = function( X,Y: Integer ): Integer;
function Add( X,Y: Integer ): Integer;
begin
Add := X+Y
end;
functionSub( X,Y: Integer ): Integer;
begin
Sub := X-Y
end;
functionMathAction( X,Y: Integer;
Proc: TMathFun ): Integer;
begin
Result := Proc( X,Y )
end;
Теперь к функции MathAction можно обращаться так:
WriteLn( MathAction) 10, 4, Add ) );
при этом будет напечатано число 14, или так:
WriteLn( MathAction( 10, 4, Sub ) );
В этом случае будет напечатано число 6.
Чтобы проверить, содержит ли переменная процедурного типа описание конкретной подпрограммы, используется стандартная функция Assigned(), которая в качестве аргумента получает процедурную переменную, а возвращает значение типа Boolean (если оно равно True, то переменная имеет корректное значение). С переменными, хранящими указатели на функции, надо обращаться осторожно. Переменной, хранящей указатель на процедуру, можно присвоить значение такой же переменной. В то же время, если в левой части оператора присваивания стоит переменная типа, совпадающего с типом значения, возвращаемого функцией, то произойдет вызов функции. Когда надо выполнять копирование указателей, а когда — вызывать функции, решает компилятор в зависимости от контекста
typeTP = procedure;
TF = function: integer;
varpi, p2: TP;
fl, f2: TF;
N: Integer;
procedureA;
begin
end;
functionB: integer;
begin
В := 0
end;
p2 := A;
p1 := p2;
// произойдет копирование указателя
f2 := В;
f1 := f2;
// произойдет копирование указателя
N := f2;
// произойдет вызов функции В
//и запись значения в переменную N
Указатели на подпрограммы
Хотя переменные, описанные как процедурные типы, фактически являются указате-лями, от программиста эта их особенность скрыта. Но Паскаль разрешает также явно описывать переменные-указатели на подпрограммы. Для этого в языке введен особый тип данных Pointer, представляющий собой указатель на информацию, не имеющую конкретного типа. Получение адреса начала подпрограммы выполняется с помощью операции @, так же, как и для получения адреса любых других данных,
varX: Pointer;
X := @МуProcedure;
Подобным способом в программе определяются и процедурные константы-указатели:
constР: Pointer = @MyFunction;
Контрольні питання
1. Надайте характеристику поняттю структури підпрограми
2. Охарактеризуйте поняття заголовку підпрограми
3. Опишіть процедуру передачі параметрів по назві та значенню
4. Охарактеризуйте параметри константи
5. Охарактеризуйте параметри результату
АУДИТОРНЕ ЗАНЯТТЯ
ЗМІСТОВИЙ МОДУЛЬ 5: МЕТОДОЛОГІЯ РОЗРОБКИ ПРОГРАМ
ТЕМА 5.1: ПРИЙОМИ ОСНОВ ПРОГРАМУВАННЯ
Лекція №33 – Етапи розробки програм
План заняття
1. Характеристика поняття програма
2. Поняття етапів розробки програм
3. Характеристика етапу Специфікація
4. Характеристика етапу Розробка алгоритму
5. Характеристика етапу Кодування
6. Характеристика етапу Відладка
7. Характеристика етапу Тестування
8. Характеристика етапу Створення довідкової системи
9. Характеристика етапу Створення установчого диску
Дата добавления: 2014-12-01; просмотров: 874;