Spec-Zone.ru › Ada 2012
Справочник по Ada 2012

3.6 Типы массивов

Объект массива — это составной объект, состоящий из компонентов, которые все имеют один и тот же подтип. Имя компонента массива использует одно или несколько значений индексов, принадлежащих указанным дискретным типам. Значение объекта массива — это составное значение, состоящее из значений компонентов.

Синтаксис

array_type_definition ::=
unconstrained_array_definition | constrained_array_definition
unconstrained_array_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
discrete_subtype_definition ::= дискретныйsubtype_indication | диапазон
component_definition ::=
[aliased] subtype_indication
| [aliased] access_definition

Правила разрешения имён

Для discrete_subtype_definition, являющейся диапазоном, диапазон должен разрешаться как некоторого конкретного дискретного типа; этот дискретный тип определяется без использования контекста, кроме границ диапазона (плюс предпочтение 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, либо подтип определяется диапазоном следующим образом:
  • Если тип диапазона разрешается как root_integer, то discrete_subtype_definition определяет подтип предопределённого типа Integer с границами, заданными преобразованием границ диапазона в Integer;
  • В противном случае, discrete_subtype_definition определяет подтип типа диапазона с границами, заданными диапазоном.
component_definition array_type_definition определяет номинальный подтип компонентов. Если зарезервированное слово aliased появляется в component_definition, каждый компонент массива является алиасом (см. 3.10).

Динамическая семантика

Разработка array_type_definition создаёт тип массива и его первый подтип, и состоит из разработки любых discrete_subtype_definition и component_definition.
Разработка discrete_subtype_definition, не содержащая выражений для каждого объекта, создаёт дискретный подтип и состоит из разработки subtype_indication или оценки диапазона. Разработка 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, — это тип компонента массива, определенного типом full_type_declaration, на котором он появляется.
ПРИМЕЧАНИЯ
49 Все компоненты массива имеют один и тот же подтип. В частности, для массива компонентов, являющихся одномерными массивами, это означает, что все компоненты имеют одинаковые границы и, следовательно, одинаковую длину.
50 Каждое расширение 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 Table is array(1 .. 10) of Integer;
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)


Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API