Спецификация внутреннего представления данных
С помощью спецификации представления, для идентификаторов любого перечислимого типа можно указать специфические значения для внутреннего представления значений перечислимого типа.
Предположим, что у нас есть перечислимый тип, который описывает страны:
type Country is (USA, Russia, France, UK, Australia); |
Мы можем, используя спецификацию представления, указать для каждого идентификатора этого перечислимого типа значение телефонного кода соответствующей страны следующим образом:
type Country is (USA, Russia, France, UK, Australia); for Country use (USA => 1, Russia => 7, France => 33, UK => 44, Australia => 61); |
Таким образом, внутреннее значение используемое, например, для представления идентификатора France будет 33.
При спецификации внутреннего представления перечислимого типа, значения для внутреннего представления должны указываться в порядке увеличения значений и быть уникальны.
Следует также обратить внимание на то, что атрибуты перечислимого типа будут возвращать значения которые не учитывают спецификацию внутреннего представления, например:
Country'Succ(USA) | возвратит: Russia | |
Country'Pred(Australia) | возвратит: UK | |
Country'Pos(Russia) | возвратит: 1 | |
Country'Val(2) | возвратит: France |
Для того, чтобы получить доступ к значениям внутреннего представления перечислимого типа необходимо воспользоваться стандартным настраиваемым модулем Ada.Unchecked_Convertion, который позволяет получить внутреннее представление объекта как значение другого типа, не выполняя при этом никаких промежуточных преобразований.
Следует заметить, что использование модуля настраиваемой функции Ada.Unchecked_Convertion
обладает одним ограничением: объект-источник и объект-приемник должны иметь одинаковый битовый размер.
Поэтому, чтобы гарантировать соответствие размеров объектов источника и приемника, необходимо указать компилятору размер внутреннего представления перечислимого типа Country.
Например, можно указать, что размер внутреннего представления типа Country
должен быть равен размеру типа Integer.
Это можно выполнить следующим образом:
type Country is (USA, Russia, France, UK, Australia); for Country'Size use Integer'Size; for Country use (USA => 1, Russia => 7, France => 33, UK => 44, Australia => 61); |
возвращает размер экземпляра объекта типа T в битах.
Следующий пример простой программы, которая выводит телефонный код Франции, демонстрирует использование рассмотренных средств спецификации внутреннего представления:
with Ada.Unchecked_Conversion; with Ada.Text_IO; use Ada.Text_IO; procedure Main is type Country is (USA, Russia, France, UK, Australia); for Country'Size use Integer'Size; for Country use (USA => 1, Russia => 7, France => 33, UK => 44, Australia => 61); function International_Dialing_Code is new Ada.Unchecked_Conversion (Country, Integer); begin Put ("International Dialing Code for France is "); Put ( Integer'Image(International_Dialing_Code (France)) ); New_Line; end Main; |