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