В Аda типы, работающие с неограниченными объемами информации, можно реализовать с помощью ссылочных типов (которые также важны и в других случаях, однако это, безусловно, одно из основных их применений). Основополагающая идея состоит в том, чтобы создать тип для элемента, в котором хранится:
Начнем с простого и опишем некий объект, с помощью которого можно будет манипулировать списком 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) одно или более ссылочных значений, для соединения связанных частей данных. Таким образом, ссылочные типы могут использоваться для создания типов данных, содержащих неограниченные объемы информации.
Перейти к предыдущему разделу | Перейти к следующему разделу | Вернуться к содержанию Урока 12 |
---|
David A. Wheeler (dwheeler@ida.org)
Исходная копия этого документа находится по адресу
"http://www.adahome.com/Tutorials/Lovelace/s12s2.htm".
Исходная копия перевода размещена на сайте http://www.ada-ru.org
Перевод: Юрий Королев
Общая редакция перевода: Г.Ю. Сисюк