Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Процедурные типы




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


type TSumFun = function (А, В: Integer): Integer;
TEmptyProc = procedure;
TMyProc = procedure (X: Real);

var SumP: 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;

function Sub(X,Y: Integer): Integer;
begin
Sub:= X-Y
end;

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


type TP = procedure;
TF = function: integer;

var pi, p2: TP;
fl, f2: TF;
N: Integer;
procedure A;
begin
end;

function B: integer;
begin
В:= 0
end;

p2:= A;
p1:= p2;
// произойдет копирование указателя

f2:= В;
f1:= f2;
// произойдет копирование указателя

N:= f2;
// произойдет вызов функции В
//и запись значения в переменную N

 

Указатели на подпрограммы


Хотя переменные, описанные как процедурные типы, фактически являются указате-лями, от программиста эта их особенность скрыта. Но Паскаль разрешает также явно описывать переменные-указатели на подпрограммы. Для этого в языке введен особый тип данных Pointer, представляющий собой указатель на информацию, не имеющую конкретного типа. Получение адреса начала подпрограммы выполняется с помощью операции @, так же, как и для получения адреса любых других данных,

var X: Pointer;

X:= @МуProcedure;

 

Подобным способом в программе определяются и процедурные константы-указатели:

const Р: Pointer = @MyFunction;

Контрольні питання

1. Надайте характеристику поняттю структури підпрограми

2. Охарактеризуйте поняття заголовку підпрограми

3. Опишіть процедуру передачі параметрів по назві та значенню

4. Охарактеризуйте параметри константи

5. Охарактеризуйте параметри результату


АУДИТОРНЕ ЗАНЯТТЯ

ЗМІСТОВИЙ МОДУЛЬ 5: МЕТОДОЛОГІЯ РОЗРОБКИ ПРОГРАМ

ТЕМА 5.1: ПРИЙОМИ ОСНОВ ПРОГРАМУВАННЯ

Лекція №33 – Етапи розробки програм




Поделиться с друзьями:


Дата добавления: 2014-12-25; Просмотров: 358; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.007 сек.