Студопедия

КАТЕГОРИИ:


Архитектура-(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)

Нетрадиционное использование подпрограмм




В Турбо Паскале есть случаи нетрадиционного объявления подпрограмм, когда в объявлении процедуры содержится директива interrupt (прерывание), external (внешняя) или inline (встроенная) или вместо блока в объявлении процедуры или функции написано forward (опережающая).

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

Примечание. CS, IP, АХ, ВХ, СХ, DX, SI, DI, DS, ES, ВР — регистры процессора.

Внешние объявления (external). Внешние объявления позволяют связывать отдельно скомпилированные процедуры и функции, написанные на языке ассемб­лера. С помощью директивы {$L имя файла} внешнюю программу можно связать с программой или модулем, написанным на Паскале.

Приведем следующие примеры объявлений внешних процедур:

В тексте программы при объявлении внешних подпрограмм нужно задать ди­рективу компилятору $L, аргументом которой является имя OBJ-файла, содержа­щего код подключаемой подпрограммы, например: {$L BLOCK.OBJ}

Assembler. Assembler-объявление позволяет вам написать процедуру или эункцию на встроенном Ассемблере (язык программирования низкого уровня, близкий к машинному).

Inline (встроенная). Директива inline позволяет записывать инструкции в ма­шинном коде, не используя блок операторов. При вызове обычной процедуры компилятор создает код, в котором параметры процедуры помещаются в стек, а за­тем для вызова процедуры генерируется инструкция call. Когда вы вызываете внут­реннюю процедуру, компилятор генерирует код из директивы inline вместо call. Таким образом, inline-процедура "расширяется" при каждом обращении к ней ана­логично макрокоманде на языке ассемблера. (Макрокоманда — macro — предло­жение языка программирования, вместо которого компилятор при трансляции за­писывает несколько машинных команд.)

Опережающие объявления (forward). Помимо прямых рекурсий, рассмотрен­ных ранее, рекурсивный вызов может быть и косвенным, т. е. одна процедура вы­зывает другую процедуру, которая, в свою очередь, вызывает первую процедуру.

А так как до вызова процедуры она обязательно должна быть описана, то ис­пользуется опережающее объявление: процедура содержит описание только сво­его заголовка, вслед за которым ставится зарезервированное слово forward (опере­жающий), а описание текста процедуры помещается далее в тексте программы уже без повторения описания списка формальных параметров и называется опреде­ляющим объявлением.

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

Определяющее объявление процедуры может быть external или assembler. Однако оно не может быть near-; far-; inline- или другим forward-объявлением. Оп­ределяющее объявление также не может содержать директивы interrupt, near или far. Опережающие объявления не допускаются в интерфейсной части модуля. На­пример:

Как видно из примера, опережающее объявление процедуры Р1 позволило ис­пользовать обращение к ней из процедуры Р2, так как при трансляции компилятор) до вызова процедуры Р1 из опережающего объявления становятся известными ее формальные параметры и он может правильно организовать ее вызов. В самом теле процедуры Р1 уже нет необходимости описывать параметры, так как это было сде­лано при опережающем описании.

Примером программы с использованием вложенных подпрограмм-процедур может быть программа Demo_Tower, в которой реализован алгоритм древней игры "Ханойские башни". Имеются три стержня, на одном из них (например, на левом) насажены диски разных размеров, причем диски располагаются так, чтобы стер­жень с дисками напоминал башню, т. е. внизу располагаются самые большие дис­ки, а вверху маленькие. Цель игры — перенести башню с правого стержня на ле­вый, причем за один раз можно переносить только один диск и при этом можно на­саживать только диск с меньшим диаметром на диск с большим диаметром. Сред­ний стержень является вспомогательным для временного хранения дисков.

Упражнение 8. Изучите текст программы. Запустите интегрированную среду програм­мирования. Введите текст программы Demo_Tower и запишите файл на диск под соответст­вующим именем, а затем откомпилируйте его. После того как компиляция выполнится ус­пешно, задайте для просмотра в окне отладчика переменные From, Tol, Work, Hight=l. Уста­новите видимыми одновременно окна редактора с текстом программы и окно просмотра. Исполните программу в пошаговом режиме с заходом в процедуры и пронаблюдайте за ре­курсивным вызовом процедуры MoveTower.

В дальнейшем после изучения графических процедур Турбо Паскаля вы може­те представить перенос дисков со стержня на стержень графически

 




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


Дата добавления: 2015-05-09; Просмотров: 389; Нарушение авторских прав?; Мы поможем в написании вашей работы!


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



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




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