Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь FAQ Написать работу КАТЕГОРИИ: ТОП 10 на сайте Приготовление дезинфицирующих растворов различной концентрацииТехника нижней прямой подачи мяча. Франко-прусская война (причины и последствия) Организация работы процедурного кабинета Смысловое и механическое запоминание, их место и роль в усвоении знаний Коммуникативные барьеры и пути их преодоления Обработка изделий медицинского назначения многократного применения Образцы текста публицистического стиля Четыре типа изменения баланса Задачи с ответами для Всероссийской олимпиады по праву
Мы поможем в написании ваших работ! ЗНАЕТЕ ЛИ ВЫ?
Влияние общества на человека
Приготовление дезинфицирующих растворов различной концентрации Практические работы по географии для 6 класса Организация работы процедурного кабинета Изменения в неживой природе осенью Уборка процедурного кабинета Сольфеджио. Все правила по сольфеджио Балочные системы. Определение реакций опор и моментов защемления |
Процедуры, играющие роль операторовСодержание книги
Поиск на нашем сайте С развитием языка Паскаль в рамках среды Delphi 7 в него добавлялось множество новых полезных возможностей, нередко заимствованных из других языков про- граммирования. Эти возможности вводились в Паскаль не в виде новых операторов, что нарушило бы идеологию языка, а в виде стандартных подпрограмм, которые, хотя и не выделяются цветом наравне с другими ключевыми словами, тем не менее, фактически являются таковыми. И реализуются подобные подпрограммы не в виде обращений к машинному коду, хранимому в программной библиотеке. Компиля- тор не добавляет в генерируемый код ссылку, а превращает данную ≪процедуру≫, подобно обычным операторам, в небольшой набор машинных инструкций (а иногда и в одну такую инструкцию). Одна из таких весьма полезных процедур — Exit (без параметров). Exit; При ее выполнении происходит немедленное завершение текущей подпрограммы и передача управления вызывающей программе. Такая возможность часто требу- ется, когда логика, реализуемая в подпрограмме, достаточно сложна и организовать линейный выход из подпрограммы (по достижении ее конца) затруднительно. Подпрограммы 65 Полезна подпрограмма Exit и в тех случаях, когда при определенных значениях параметров вычислить значение функции удается сразу. Например, если при вычис- лении факториала числа параметр равен 1, можно сразу определить возвращаемое значение, также равное 1, и покинуть подпрограмму. Процедурные типы Процедуры в Паскале разрешается использовать при описании новых типов. На основании таких типов, обладающих равными правами с другими типами, можно описывать переменные, что позволяет передавать подпрограммы в качестве пара- метров. Подобный прием в некоторых случаях помогает эффективно решить слож- ную задачу, с трудом поддающуюся кодированию обычным способом, однако пользоваться им нежелательно, по крайней мере начинающим разработчикам. Примеры: 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. ЗАМЕЧАНИЕ Переменные процедурных типов являются указателями. В них хра- нится только адрес ячейки оперативной памяти, где начинается со- ответствующая процедура. Подпрограмму можно передавать в другую подпрограмму как параметр. Это удобно, когда над аргументами надо выполнять различные сложные действия в зависимости 3 За* 348 66 Урок 1. Язык Delphi (Object Pascal] и его использование от некоторых условий. В приведенном ниже примере функция 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 MathActionl X,Y: Integer; Proc: TMathFun): Integer; begin Result:= Proc! X,Y) end; Теперь к функции MathAction можно обращаться так: WriteLn(MathActioni 10, 4, Add)); при этом будет напечатано число 14, или так: WriteLnl MathActionl 10, 4, Sub) }; В этом случае будет напечатано число 6. Чтобы проверить, содержит ли переменная процедурного типа описание конкретной подпрограммы, используется стандартная функция AssignedQ, которая в качестве аргумента получает процедурную переменную, а возвращает значение типа Boolean (если оно равно True, то переменная имеет корректное значение). С переменными, хранящими указатели на функции, надо обращаться осторожно. Переменной, хранящей указатель на процедуру, можно присвоить значение такой же переменной. В то же время, если в левой части оператора присваивания стоит пере- менная типа, совпадающего с типом значения, возвращаемого функцией, то про- изойдет вызов функции. Когда надо выполнять копирование указателей, а когда — вызывать функции, решает компилятор в зависимости от контекста. type TP = procedure; TF = function: integer,- var pi, p2: TP; fl, £2: TF; N: Integer; Операторы 67 procedure А; begin end; function В: integer; begin В:= О end; p2:= A; Pi:= p2; // произойдет копирование указателя f2: = В,- fl:- f2; // произойдет копирование указателя N:= f2; // произойдет вызов функции В //и запись значения в переменную N Указатели на подпрограммы Хотя переменные, описанные как процедурные типы, фактически являются указате- лями, от программиста эта их особенность скрыта. Но Паскаль разрешает также явно описывать переменные-указатели на подпрограммы. Для этого в языке введен особый тип данных Pointer, представляющий собой указатель на информацию, не имеющую конкретного типа. Получение адреса начала подпрограммы выполняется с помощью операции @, так же, как и для получения адреса любых других данных. var X: Pointer; X:= OMyProcedure; Подобным способом в программе определяются и процедурные константы-указа- тели: const P: Pointer = OMyFunction;__ (объявление ссылок на метки??) @F адрес того,что лежит в переменной @@Fадрес самой переменной
|
||
|
Последнее изменение этой страницы: 2017-02-21; просмотров: 290; Нарушение авторского права страницы; Мы поможем в написании вашей работы! infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 216.73.217.21 (0.01 с.) |