Справочник по Ada 2005
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 выполняются в произвольном порядке.
ПРИМЕЧАНИЯ
43 Все компоненты массива имеют один и тот же подтип. В частности, для массива компонентов, являющихся одномерными массивами, это означает, что все компоненты имеют одинаковые границы и, следовательно, одинаковую длину.
44 Каждое выполнение array_type_definition создаёт отдельный тип массива. Следствием этого является то, что каждый объект, объявление object_declaration которого содержит array_type_definition, имеет свой уникальный тип.
Примеры
Примеры объявлений типов с определениями неограниченных массивов:
type Vector is array(Integer range <>) of Real;
type Matrix is array(Integer range <>, Integer range <>) of Real;
type Bit_Vector is array(Integer range <>) of Boolean;
type Roman is array(Positive range <>) of Roman_Digit; -- см. 3.5.2
type Matrix is array(Integer range <>, Integer range <>) of Real;
type Bit_Vector is array(Integer range <>) of Boolean;
type Roman is array(Positive range <>) of Roman_Digit; -- см. 3.5.2
Примеры объявления типов с ограниченными массивами:
type Table is array(1 .. 10) of Integer;
type Schedule is array(Day) of Boolean;
type Line is array(1 .. Max_Line_Size) of Character;
type Schedule is array(Day) of Boolean;
type Line is array(1 .. Max_Line_Size) of Character;
Примеры объявления объектов с типами массивов:
Grid : array(1 .. 80, 1 .. 100) of Boolean;
Mix : array(Color range Red .. Green) of Boolean;
Msg_Table : constant array(Error_Code) of access constant String :=
(Too_Big => new String'("Result too big"), Too_Small => ...);
Page : array(Positive range <>) of Line := -- массив массивов
(1 | 50 => Line'(1 | Line'Last => '+', others => '-'), -- см. 4.3.3
2 .. 49 => Line'(1 | Line'Last => '|', others => ' '));
-- Page ограничен своим начальным значением (1..50)
Mix : array(Color range Red .. Green) of Boolean;
Msg_Table : constant array(Error_Code) of access constant String :=
(Too_Big => new String'("Result too big"), Too_Small => ...);
Page : array(Positive range <>) of Line := -- массив массивов
(1 | 50 => Line'(1 | Line'Last => '+', others => '-'), -- см. 4.3.3
2 .. 49 => Line'(1 | Line'Last => '|', others => ' '));
-- Page ограничен своим начальным значением (1..50)