Справочник Ada 2012
3.6.1 Ограничения индексов и дискретные диапазоны
Ограничение индексов определяет диапазон возможных значений для каждого индекса типа массива, а тем самым и соответствующие границы массива.
Синтаксис
Правила разрешения имен
Тип discrete_range — это тип подтипа, определённого subtype_indication, или тип range. Для ограничения индексов каждый discrete_range должен иметь тип соответствующего индекса.
Правила допустимости
Ограничение индексов должно появляться только в subtype_indication, метка подтипа которой обозначает либо неявный тип массива, либо неявный тип доступа, подтип которого является неявным типом массива; в обоих случаях ограничение индексов должно предоставлять discrete_range для каждого индекса типа массива.
Статическая семантика
discrete_range определяет диапазон, границы которого заданы range или диапазоном подтипа, определённого subtype_indication.
Динамическая семантика
Ограничение индексов является совместимым с неявным типом массива тогда и только тогда, когда диапазон индексов, определённый каждым discrete_range, совместим (см. 3.5) с соответствующим подтипом индекса. Если любой из discrete_range определяет пустой диапазон, массив, ограниченный таким образом, является пустым массивом, не имеющим компонентов. Значение массива удовлетворяет ограничению индексов, если в каждой позиции индекса значение массива и ограничение индексов имеют одинаковые границы индексов.
Разработка ограничения индексов состоит из вычисления discrete_range (ов) в произвольном порядке. Вычисление discrete_range состоит из разработки subtype_indication или вычисления range.
ПРИМЕЧАНИЯ
51 Разработка subtype_indication, состоящей из метки подтипа, за которой следует ограничение индексов, проверяет совместимость ограничения индексов с меткой подтипа (см. 3.2.2).
52 Даже если значение массива не удовлетворяет ограничению индексов подтипа массива, Constraint_Error не поднимается при преобразовании в подтип массива, до тех пор, пока длина каждой размерности значения массива и подтипа массива не совпадают. См. 4.6.
Примеры
Примеры объявлений массивов, включающих ограничение индексов:
Board : Matrix(1 .. 8, 1 .. 8); -- см. 3.6
Rectangle : Matrix(1 .. 20, 1 .. 30);
Inverse : Matrix(1 .. N, 1 .. N); -- N необязательно статично
Rectangle : Matrix(1 .. 20, 1 .. 30);
Inverse : Matrix(1 .. N, 1 .. N); -- N необязательно статично
Filter : Bit_Vector(0 .. 31);
Пример объявления массива с ограниченным подтипом массива:
My_Schedule : Schedule; -- все массивы типа Schedule имеют одинаковые границы
Пример типа записи с компонентом, который является массивом:
type Var_Line(Length : Natural) is
record
Image : String(1 .. Length);
end record;
record
Image : String(1 .. Length);
end record;
Null_Line : Var_Line(0); -- Null_Line.Image — это пустой массив