Главная  Радио и связь 

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


Рис. 2.3. Стековый пакет.

Элемент

Состояние Состояние

Элемент

PUSH

у--у

! SPACE )

у Пакет STACK

Структура пользовательского вызова:

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