Справочное руководство по языку Ада-83

Пример пакета работы с таблицами


Следующий пример иллюстрирует использование пакетов для организации простого взаимодействия пользователя с довольно сложными процедурами.

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

С точки зрения пользователя, пакет чрезвычайно прост. Существует тип с именем ITEM — тип элемента таблицы, есть процедура INSERT для включения элементов в таблицу и процедура RETRIEVE для извлечения элемента с наименьшим порядковым номером. Если таблица пуста, то возвращается специальный элемент NULL-ITEM, а если таблица заполнена, то при выяпяй nnniiftnvnki INRFRT по.чЛужляйтся искпючание TABLE _FULL-

Ниже приведена схема такого пакета. Пользователю известна только спецификация пакета.

package TABLE_MANAGER is

type ITEM is record

ORDER_NUM : INTEGER; ITEM_CODE : INTEGER; QUANTITY : INTEGER; ITEM-TYPE : CHARACTER; end record;

NULL-ITEM : constant ITEM := (ORDER_NUM | ITEM_CODE | QUANTITY => 0, ITEM_TYPE => ' ');

procedure INSERT (NEWJTEM : in ITEM); procedure RETRIEVE (FIRSTJTEM : out ITEM);

TABLE_FULL : exception; -— это исключение возбуждается в процедуре end; -— INSERT, если таблица заполнена

Детали реализации таких пакетов могут быть достаточно сложными; в данном случае используются двусвязные списки внутренних элементов. Локальная вспомогательная процедура EXCHANGE используется для перемещения внутренних элементов из списка занятых в список свободных. Начальные связи таблицы устанавливаются в разделе инициализации. Нет необходимости показывать пользователям тело пакета.

package body TABLE_MANAGER is

SIZE : constant := 2000; subtype INDEX is INTEGER range 0 .. SIZE;



type INTERNAL-ITEM is record

CONTENT : ITEM; SUCC : INDEX; PRED : INDEX; end record;

TABLE : array (INDEX) of INTERNAL-ITEM; FIRST_BUSY_ITEM : INDEX := 0; FIRST_FREE_ITEM : INDEX := 1; function FREE_LIST_EMPTY return BOOLEAN is ...


end;
function BUSY_LIST_EMPTY return BOOLEAN is ... end;
procedure EXCHANGE (FROM : in INDEX; TO : in INDEX) is ... end;
procedure INSERT (NEWJTEM : in ITEM) is begin
if FREE_LIST_EMPTY then raise TABLE_FULL; end if;
-— остальная часть кода подпрограммы INSERT end INSERT;
procedure RETRIEVE (FIRSTJTEM : out ITEM) is ... end;
begin
-— инициализация связей таблицы end TABLE_MANAGER;

Пред.  Уровень выше  След.
7.4. ОПИСАНИЯ ЛИЧНЫХ ТИПОВ И СУБКОНСТАНТ
 
Содержание  
7.6. ПРИМЕР ПАКЕТА ОБРАБОТКИ ТЕКСТОВ
Содержание раздела