Справочник по Ada 2005
3.6.1 Ограничения индексов и дискретные диапазоны
Ограничение индекса определяет диапазон возможных значений для каждого индекса подтипа массива, а также соответствующие границы массива.
Синтаксис
Правила разрешения имен
Тип дискретного_диапазона — это тип подтипа, определенного указанием подтипа, или тип диапазона. Для ограничения индекса каждый дискретный_диапазон должен иметь тип, соответствующий типу соответствующего индекса.
Правила легальности
Ограничение индекса должно появляться только в указании подтипа, метка подтипа которого обозначает либо не ограниченный подтип массива, либо не ограниченный подтип доступа, назначенный подтип которого является неограниченным подтипом массива; в любом случае, ограничение индекса должно предоставлять дискретный_диапазон для каждого индекса типа массива.
Статическая семантика
Дискретный_диапазон определяет диапазон, границы которого задаются диапазоном или диапазоном подтипа, определенного указанием подтипа.
Динамическая семантика
Ограничение индекса совместимо с не ограниченным подтипом массива только тогда, когда диапазон индекса, определяемый каждым дискретным_диапазоном, совместим (см. 3.5) с соответствующим подтипом индекса. Если какой-либо из дискретных_диапазонов определяет пустой диапазон, любой массив, ограниченный таким образом, является пустым массивом, не имеющим компонентов. Значение массива удовлетворяет ограничению индекса, если в каждой позиции индекса значение массива и ограничение индекса имеют одинаковые границы индекса.
Вычисление ограничения индекса состоит из оценки дискретных_диапазонов (в произвольном порядке). Вычисление дискретного_диапазона состоит из вычисления указания подтипа или оценки диапазона.
ПРИМЕЧАНИЯ
45 Вычисление указания подтипа, состоящего из метки подтипа, за которым следует ограничение индекса, проверяет совместимость ограничения индекса с меткой подтипа (см. 3.2.2).
46 Даже если значение массива не удовлетворяет ограничению индекса подтипа массива, ошибка 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 является пустым массивом