Справочник по Ada (Ada 2022)
3.6 Типы массивов
Объект массива — это составной объект, состоящий из компонентов, у которых все одинаковый подтип. Имя компонента массива использует одно или несколько значений индексов, принадлежащих указанным дискретным типам. Значение объекта массива — это составное значение, состоящее из значений компонентов.
Синтаксис
unconstrained_array_definition ::=
array(index_subtype_definition {, index_subtype_definition}) of component_definition
array(index_subtype_definition {, index_subtype_definition}) of component_definition
constrained_array_definition ::=
array (discrete_subtype_definition {, discrete_subtype_definition}) of component_definition
array (discrete_subtype_definition {, discrete_subtype_definition}) of component_definition
Правила разрешения имён
Для discrete_subtype_definition, являющегося range, range должен быть разрешён в некоторый конкретный дискретный тип; тип должен быть определён без использования контекста, кроме границ range (плюс предпочтение для root_integer — см. 8.6).
Правила легальности
Каждый index_subtype_definition или discrete_subtype_definition в array_type_definition определяет подтип индекса; его тип (тип индекса) должен быть дискретным.
Подтип, определённый subtype_indication component_definition (подтип компонента) должен быть определённым подтипом.
Этот абзац был удалён.
Статическая семантика
Массив характеризуется числом индексов (размерностью массива), типом и позицией каждого индекса, нижними и верхними границами для каждого индекса и подтипом компонентов. Порядок индексов имеет значение.
Одномерный массив имеет отдельный компонент для каждого возможного значения индекса. Многомерный массив имеет отдельный компонент для каждой возможной последовательности значений индексов, которая может быть сформирована путём выбора одного значения для каждой позиции индекса (в заданном порядке). Возможные значения для данного индекса — все значения между нижней и верхней границами включительно; этот диапазон значений называется диапазоном индекса. Границы массива — это границы его диапазонов индексов. Длина измерения массива — это количество значений диапазона индексов измерения (ноль для пустого диапазона). Длина одномерного массива — это длина его единственного измерения.
array_type_definition определяет тип массива и его первый подтип. Для каждого объекта этого типа массива количество индексов, тип и позиция каждого индекса и подтип компонентов такие же, как и в определении типа; значения нижней и верхней границ для каждого индекса принадлежат соответствующему подтипу индекса его типа, за исключением нулевых массивов (см. 3.6.1).
unconstrained_array_definition определяет тип массива с неограниченным первым подтипом. Каждый index_subtype_definition определяет соответствующий подтип индекса как подтип, обозначенный subtype_mark. Составной разделитель <> (называемый боксом) index_subtype_definition обозначает неопределённый диапазон (разные объекты типа могут иметь разные границы).
constrained_array_definition определяет тип массива с ограниченным первым подтипом. Каждый discrete_subtype_definition определяет соответствующий подтип индекса, а также соответствующий диапазон индексов для ограниченного первого подтипа. Ограничение первого подтипа состоит из границ диапазонов индексов.
Дискретный подтип, определённый discrete_subtype_definition, — это подтип, определённый subtype_indication, или подтип, определённый range следующим образом:
- Если тип range разрешается в root_integer, то discrete_subtype_definition определяет подтип предопределённого типа Integer с границами, полученными путём преобразования границ range в Integer;
- В противном случае discrete_subtype_definition определяет подтип типа range с границами, заданными range.
component_definition array_type_definition определяет номинальный подтип компонентов. Если зарезервированное слово aliased появляется в component_definition, то каждый компонент массива является алиасом (см. 3.10).
Динамическая семантика
Разработка array_type_definition создаёт тип массива и его первый подтип и включает в себя разработку любых discrete_subtype_definition и component_definition.
Разработка discrete_subtype_definition, не содержащая выражений на объект, создаёт дискретный подтип и включает в себя разработку subtype_indication или вычисление range. Разработка discrete_subtype_definition, содержащая одно или несколько выражений на объект, определена в 3.8. Разработка component_definition в array_type_definition включает в себя разработку subtype_indication или access_definition. Разработка любых discrete_subtype_definition и разработка component_definition выполняются в произвольном порядке.
Статическая семантика
Для типа массива со скалярным типом компонента можно указать следующий определяемый языком аспект представления с помощью aspect_specification (см. 13.1.1):
Default_Component_Value
Этот аспект должен быть указан статическим выражением, и это выражение должно быть явным, даже если аспект имеет булевый тип. Default_Component_Value должен быть указан только в full_type_declaration.
Если производный тип наследует булевый аспект Default_Component_Value, для производного типа аспект может быть указан любым значением.
Правила разрешения имён
Ожидаемый тип для выражения, указанного для аспекта Default_Component_Value, — это тип компонента типа массива, определенного полным_объявлением_типа, на котором он появляется.
ПРИМЕЧАНИЕ 1 Все компоненты массива имеют один и тот же подтип. В частности, для массива компонентов, являющихся одномерными массивами, это означает, что все компоненты имеют одинаковые границы и, следовательно, одинаковую длину.
ПРИМЕЧАНИЕ 2 Каждое уточнение определения_типа_массива создает отдельный тип массива. Следствием этого является то, что каждый объект, объявление которого объявление_объекта содержит определение_типа_массива, относится к своему уникальному типу.
Примеры
Примеры объявлений типов с неограниченными определениями массивов:
тип Vector является массивом(Целое диапазон <>) из Вещественного;
тип Matrix является массивом(Целое диапазон <>, Целое диапазон <>) из Вещественного;
тип Bit_Vector является массивом(Целое диапазон <>) из Булевого;
тип Roman является массивом(Положительное диапазон <>) из Roman_Digit; -- см. 3.5.2
тип Matrix является массивом(Целое диапазон <>, Целое диапазон <>) из Вещественного;
тип Bit_Vector является массивом(Целое диапазон <>) из Булевого;
тип Roman является массивом(Положительное диапазон <>) из Roman_Digit; -- см. 3.5.2
Примеры объявлений типов с ограниченными определениями массивов:
тип Table является массивом(1 .. 10) из Целого;
тип Schedule является массивом(День) из Булевого;
тип Line является массивом(1 .. Max_Line_Size) из Символа;
тип Schedule является массивом(День) из Булевого;
тип Line является массивом(1 .. Max_Line_Size) из Символа;
Примеры объявлений объектов с определениями типов массивов:
Grid : массив(1 .. 80, 1 .. 100) из Булевого;
Mix : массив(Цвет диапазон Красный .. Зеленый) из Булевого;
Msg_Table : постоянный массив(Код_ошибки) из доступа к постоянному Строке :=
(Too_Big => новое Строка'("Результат слишком большой"), Too_Small => ...);
Page : массив(Положительное диапазон <>) из Line := -- массив массивов
(1 | 50 => Line'(1 | Line'Last => '+', другие => '-'), -- см. 4.3.3
2 .. 49 => Line'(1 | Line'Last => '|', другие => ' '));
-- Page ограничен своим начальным значением (1..50)
Mix : массив(Цвет диапазон Красный .. Зеленый) из Булевого;
Msg_Table : постоянный массив(Код_ошибки) из доступа к постоянному Строке :=
(Too_Big => новое Строка'("Результат слишком большой"), Too_Small => ...);
Page : массив(Положительное диапазон <>) из Line := -- массив массивов
(1 | 50 => Line'(1 | Line'Last => '+', другие => '-'), -- см. 4.3.3
2 .. 49 => Line'(1 | Line'Last => '|', другие => ' '));
-- Page ограничен своим начальным значением (1..50)