Справочник Ada 95
3.6 Типы массивов
Объект массива — это составной объект, состоящий из компонентов, которые все имеют один и тот же подтип. Имя компонента массива использует одну или несколько значений индексов, принадлежащих указанным дискретным типам. Значение объекта массива — это составное значение, состоящее из значений компонентов.
Синтаксис
array_type_definition ::=
unconstrained_array_definition | constrained_array_definition
unconstrained_array_definition | constrained_array_definition
unconstrained_array_definition ::=
array(index_subtype_definition {, index_subtype_definition}) of component_definition
array(index_subtype_definition {, index_subtype_definition}) of component_definition
index_subtype_definition ::= subtype_mark range <>
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 ::= discrete_subtype_indication | range
component_definition ::= [aliased] subtype_indication
Правила разрешения имен
Для discrete_subtype_definition, являющейся range, range должен разрешаться как некоторый конкретный дискретный тип; этот дискретный тип определяется без использования какого-либо контекста, кроме границ range (плюс предпочтение root_integer — см. 8.6).
Правила допустимости
Каждый index_subtype_definition или discrete_subtype_definition в array_type_definition определяет подтип индекса; его тип (тип индекса) должен быть дискретным.
Подтип, определяемый subtype_indication в component_definition (подтип компонента), должен быть определённым подтипом.
Внутри определения нелимитированного составного типа (или лимитированного составного типа, который позднее в своей непосредственной области становится нелимитированным — см. 7.3.1 и 7.5), если component_definition содержит зарезервированное слово aliased, и тип компонента является дискриминированным, то номинальный подтип компонента должен быть ограниченным.
Статическая семантика
Массив характеризуется числом индексов (размерностью массива), типом и положением каждого индекса, нижними и верхними границами для каждого индекса и подтипом компонентов. Порядок индексов имеет значение.
Одномерный массив имеет отдельный компонент для каждого возможного значения индекса. Многомерный массив имеет отдельный компонент для каждой возможной последовательности значений индексов, которые могут быть сформированы путём выбора одного значения для каждой позиции индекса (в заданном порядке). Возможные значения для данного индекса — это все значения между нижней и верхней границами включительно; этот диапазон значений называется диапазоном индекса. Границы массива — это границы его диапазонов индексов. Длина измерения массива — это количество значений диапазона индексов измерения (ноль для пустого диапазона). Длина одномерного массива — это длина его единственного измерения.
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. Развёртывание discrete_subtype_definition и развёртывание component_definition выполняются в произвольном порядке.
ПРИМЕЧАНИЯ
41 Все компоненты массива имеют один и тот же подтип. В частности, для массива компонентов, которые являются одномерными массивами, это означает, что все компоненты имеют одинаковые границы и, следовательно, одинаковую длину.
42 Каждое развёртывание array_type_definition создаёт отдельный тип массива. Следствием этого является то, что каждый объект, объявление которого содержит 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;
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;
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)