Справочник по Ada 95
3.6.1 Ограничения индексов и дискретные диапазоны
index_constraint определяет диапазон возможных значений для каждого индекса типа массива, а также соответствующие границы массива.
Синтаксис
index_constraint ::= (discrete_range {, discrete_range})
discrete_range ::= discrete_subtype_indication | range
Правила разрешения имен
Тип discrete_range — это тип подтипа, определенного subtype_indication, или тип range. Для index_constraint каждый discrete_range должен иметь тип соответствующего индекса.
Правила допустимости
index_constraint должен появляться только в subtype_indication, у которой subtype_mark обозначает либо неявный тип массива, либо неявный тип доступа, подтип которого является неявным типом массива; в любом случае index_constraint должен задавать discrete_range для каждого индекса типа массива.
Статическая семантика
discrete_range определяет диапазон, границы которого заданы range, или диапазоном подтипа, определенного subtype_indication.
Динамическая семантика
index_constraint совместим с неявным типом массива тогда и только тогда, когда диапазон индексов, определенный каждым discrete_range, совместим (см. 3.5) с соответствующим подтипом индекса. Если какой-либо из discrete_range определяет пустой диапазон, любой массив с таким ограничением является пустым массивом, не имеющим компонентов. Значение массива удовлетворяет index_constraint, если в каждой позиции индекса значение массива и index_constraint имеют одинаковые границы индексов.
Вычисление index_constraint состоит из вычисления discrete_range(ов) в произвольном порядке. Вычисление discrete_range состоит из вычисления subtype_indication или вычисления range.
ПРИМЕЧАНИЯ
43 Вычисление subtype_indication, состоящего из subtype_mark, за которым следует index_constraint, проверяет совместимость index_constraint с subtype_mark (см. 3.2.2).
44 Даже если значение массива не удовлетворяет ограничению индексов подтипа массива, 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 — это пустой массив