![]() | |
Главная Радио и связь ![]() Рис. 2.3. Стековый пакет.
Структура пользовательского вызова: stack, pushielement, status); stack. pop (element .status); на переполнение или недогрузку стека. Тела процедур PUSH и POP и структура стековых данных, общая для обеих процедур, невидимы пользователю. Идея состоит в том, что пользователям стекового пакета не придется изменять порядок обращения к нему, даже если тело пакета будет модифицировано и приспособлено к различным типам структур стековых данных, например массивам или связным спискам. Ада-программа, реализующая этот пакет для структур стековых данных типа массивов, приведена на рис. 2.4. Первая часть представляет собой описание глобальных типов, которые используются как в вызывающем модуле, так и в пакете. Отметим, что эти типы можно было бы определить в спецификации пакета, потому что они на самом деле не глобальные, а имеют отношение только к пользователю пакета. Однако они сохранены здесь как глобальные для сравнения в дальнейшем с задачей-стеком. Спецификация стекового пакета включает спецификации процедур PUSH и POP; эти спецификации состоят всего лишь из имени процедуры и следующих за ним спецификаций ее параметров. Третий раздел - тело стекового пакета, содержащее массив фиксированного размера для стека и две процедуры PUSH и POP, работающие на этом массиве. Доступ извне к процедурам PUSH и POP обеспечивается вызовом процедур STACK-PUSH и STACK.POP. Указывая имя пакета и уточняя таким способом обращение, можно получить - ~ КОММЕНТАРИЙ w- ГЛОБАЛЬНЫЕ ТИПЫ, ИСПОЛЬЗУЕМЫЕ W - ВЫЗЫВАЮЩЕЙ ПРОГРАММОЙ И ПАКЕТОМ type tLEM is INTEGER; type STATUS is (OK, UNDERFLOW. OVERFLOW); --СТЕКОВЫЙ ПАКЕТ ДЛЯ СПЕЦИФИКАЦИИ ПЕРЕМЕННЫХ ТИПА ELEM СПЕЦИФИКАЦИЯ package STACK is - procedure PUSH (E:in ELEM; FLAG:out STATUS); procedure POP (E:out ELEM; FLAGiout iiTATUS); end STACK; •--ТЕПО package body STACK is SIZE; constant INTEGER : = 10; SPACE: array (1 .. SIZE) of ELEM; INDEX* INTEGER range 0 .. SIZE : = 0; procedure PUSH IE ; in ELEM, FLAG: out STATUS) \% begin if INDEX = SIZE then FUG : = OVERFLOW else INDEX : = INDEX + 1; SPACE (INDEX) : = E; FLAG : = OK; end if; end PUSH; procedure POP (E : out ELEM, FLAG; out STATUS) [$ begin if INDEX = 0 then FUG : = UNDERFLOW else E : = SPACE (INDEX); INDEX : = INDEX - 1; FUG:.= OK; end if; end POP; end STACK; --СТРУКТУРА ПОЛЬЗОВАТЕЛЬСКОГО ВЫЗОВА StACK.PUSH (ELEMENT, STATUS); STACK.POP (ELEMENT, STATUS); : Рис. 2.4, Ада-программа, реализующая стековый пакет. 2 Зак, 455 доступ К любому программному элементу внутри пакета, если только он сделан видимым в спецификации. Ниже перечислены некоторые ключевые моменты работы с пакетами. Установление соответствия с помощью Комментариев Основная программа 6 Код операции ПроцедурьГ Глобальный данные STACK SPACE Осиовная программа е Код операции Процедуре Основная программ* Глобальные данные ![]() Процедур» 1а) Процедуры с раздельным Iff) .Процедура с единственный (в) Приватный ТИП даннЫУ доступом методом доступа и кодом операций в (реализованный Неверно) качестве параметра. Рис. 2.5, Пакеты в языке Паскаль. • Активизация имени пакета обеспечивает доступ ко всем его элементам, поименованным в спецификации. • Спецификация пакета объявляется в программе только один раз, хотя он может быть использован несколькими модулями. • Концепция пакета является почти всеобъемлющей. • Пакеты и их спецификации можно при желании компилировать раздельно. Чем же отличаются пакеты в языке Ада от средств, которые предоставляют нам более распространенные языки? Возьмем в качестве примера «стандартный» Паскаль. Многие организации расширяли Паскаль в самых разных направлениях, но на сегодня единственное пакетное средство стандартного Паскаля - это процедура. На рис. 2.5 проиллюстрированы способы моделирования Ада-пакетов с помощью процедур Паскаля. Если стремиться к тому, чтобы PUSH и POP были раздельными процедурами, то, как показано на рис. 2.5, а, их компоновка в единый стековый пакет может быть осуществлена путем включения в текст программы соответствующих комментариев. Область, отведенная для стека, должна быть при этом объявлена как глобальные данные, а PUSH и POP - как отдельные процедуры; связь между ними нельзя установить ни с помощью имени, ни даже поместив их рядом в тексте программы. Если же все-таки желательно иметь стековый пакет с единственным именем, то, как показано на рис. 2.5, б, его следует сконструировать в виде процедуры с кодом операции в качестве параметра, который будет указывать требуемое действие. Структура стековых данных должна быть по-прежнему объявлена как гло- 0 1 2 3 4 5 6 7 8 [ 9 ] 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 0.0056 |
|||||||||||||||||||||||