Раздел 12.2 - Использование ссылочных переменных при создании типов неограниченного размера

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

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

  1. Элемент данных, с которым производятся манипуляции.
  2. Одно или более ссылочных значений, укзывающих на элементы, связанные с текущим. Эти значения могут использоваться для того, чтобы "соединить" элементы данных.

Начнем с простого и опишем некий объект, с помощью которого можно будет манипулировать списком Integer (фактически, это пример односвязного списка элементов типа Integer). Создадим тип для элемента, который будет содержать данные (целое значение) и ссылку на следующий элемент в списке.

  type List_Node is
    record
      Data        : Integer;
      Next        : List_Node_Access;  -- следующий элемент списка.
    end record;

Для создания типа List_Node необходим ссылочный тип; назовем его List_Node_Access. Ниже приведено его описание, которое необходимо поместить перед описанием List_Node:

  type List_Node_Access is access List_Node;

Теперь появляется проблема. Тип List_Node зависим от описания типа List_Node_Access, который, в свою очередь, зависим от описания List_Node. Обратите внимание на наличие рекурсии: описания зависят друг от друга. Это часто встречающаяся ситуация при использовании ссылочных типов. По правилам языка Ada, перед тем, как использовать что-либо, необходимо его описать, а тут это кажется невозможным. Способ решения состоит в использовании ``неполного описания типа'' элемента ( точно также , как это делается в C или Pascal). Неполное описание типа просто <<обещает>> компилятору Ada, что тип с данным именем будет описан позднее. Неполное описание типа состоит из ключевого слова "type", имени типа, который планируется описать позднее и следущей непосредственно за ним точки с запятой. Например, вот как можно описать типы List_Node и List_Node_Access:

  type List_Node;  -- Неполное описание типа.
  type List_Node_Access is access List_Node;
  type List_Node is
    record
      Data        : Integer;
      Next        : List_Node_Access;  -- Следующий элемент в списке.
    end record;

После описания ссылочного типа можно создавать переменные этого типа с использованием обычного синтаксиса описаний. Например, можно создать две ссылочные переменные с именами Current и Root, описав их следующим образом:

  Current, Root : Tree_Access;


Упражнение:

Верно ли следующее утверждение:

Способ реализации типов неограниченного размера состоит в создании записи (которую также часто называют "элемент"), которая будет содержать (1) данные и (2) одно или более ссылочных значений, для соединения связанных частей данных. Таким образом, ссылочные типы могут использоваться для создания типов данных, содержащих неограниченные объемы информации.

  1. Верно
  2. Не верно

Вы можете также:

PREVIOUS Перейти к предыдущему разделу

NEXT     Перейти к следующему разделу

OUTLINE  Вернуться к содержанию Урока 12

David A. Wheeler (dwheeler@ida.org)

Перевод: Юрий Королев   Общая редакция перевода: Г.Ю. Сисюк

Исходная копия этого документа находится по адресу "http://www.adahome.com/Tutorials/Lovelace/s12s2.htm".

Исходная копия перевода размещена на сайте http://www.ada-ru.org