3.6. ИНДЕКСИРУЕМЫЕ ТИПЫ

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

опеределение-индексируемого-типа :: =      определение-неограниченного-индексируемого-типа    | определение-ограниченного-индексируемого-типаопределение-неограниченного-индексируемого-типа ::=    array (определение-подтипа-индекса {, определение-подтипа-индекса}) of     указание-подтипа-компонентыопределение-ограниченного-индексируемого-типа:: =    array ограничение-индекса of указание-подтипа-компонентыопределение-подтипа-индекса ::= обозначение-типа range < > ограничение-индекса ::= (дискретный-диапазон {, дискретный-диапазон}) дискретный-диапазон :: = указание-дискретного-подтипа | диапазон

Массив характеризуется числом индексов (размерность массива), типом и позицией каждого индекса, верхней и нижней границами каждого индекса, а также типом и возможным ограничением компонент. Порядок индексов существен.

Для каждого возможного значения индекса одномерный массив имеет отдельную компоненту. Многомерный массив имеет отдельную компоненту для каждой возможной последовательности значений индексов, которая может быть образована фиксацией значений для каждой позиции индекса (в данном порядке). Возможными значениями индекса являются все значения между нижней и верхней границами включительно; этот диапазон значений называется диапазоном индекса.

Определение неограниченного индексируемого типа определяет индексируемый тип. Для каждого объекта индексируемого типа число индексов, тип и позиция каждого индекса, а также подтип компонент будут такими, как в определении типа; значение нижней и верхней границ для каждого индекса принадлежит соответствующему подтипу индекса, кроме пустых массивов, как пояснено в разд. 3.6.1. Подтипом индекса для данной позиции индекса по определению является подтип, указанный обозначением типа соответствующего определения подтипа индекса. Составной ограничитель < > (бокс) в определении подтипа индекса помещается для неопределенного диапазона (различные объекты данного типа не обязательно имеют одни и те же границы). Предвыполнение определения неограниченного индексируемого типа создает индексируемый тип: оно включает Предвыполнение указания подтипа компонент.

Определение ограниченного индексируемого типа определяет индексируемый тип и подтип этого типа:

• Индексируемый тип — это неявно описанный анонимный тип, этот тип определен (неявно) определением неограниченного индексируемого типа, в котором указание подтипа компонент берется из определения ограниченного индексируемого типа и обозначение типа каждого определения подтипа индекса определяется соответствующим дискретным диапазоном.

• Индексируемый подтип — это подтип, полученный наложением ограничения индекса на индексируемый тип.

Если определение ограниченного индексируемого типа дано для описания типа, то простое имя, введенное этим описанием, обозначает индексируемый подтип.

Предвыполнение определения ограниченного индексируемого типа создает соответствующий индексируемый тип и индексируемый подтип. При этом предвыполняются ограничение индекса и указание подтипа компонент. Вычисление каждого дискретного диапазона ограничения индекса и Предвыполнение указания подтипа компонент осуществляются в порядке, не определяемом языком.

Примеры описаний типа с определениями неограниченного индексируемого типа:

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 0) of ROMAN_DIGIT:

Примеры описаний типа с определениями ограниченного индексируемого типа:

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;

PAGE : array(1 .. 50) of LINE; -- массив массивов

Примечание. Данное для одномерного массива правило означает, что описание с определением ограниченного индексируемого типа, например

type Т is array(POSITIVE range MIN .. MAX) of COMPONENT;

эквивалентно (при отсутствии некорректной зависимости от порядка) последовательности описаний:

subtype под тип__индексаis POSITIVE range MIN .. МАХ;

type индексируемый_тип is array(подтип_индекса range <>) of COMPONENT;

subtype Т is индексируемый_тип (подтип_индекса)',

где подтип - индекса и индексируемый-тип оба анонимны. Следовательно, Т — имя подтипа, и все объекты, описанные с этим обозначением типа, — массивы, имеющие одни и те же границы. Аналогичные преобразования применяются к многомерным массивам.

Подобное преобразование применяется к объекту, описание которого включает определение ограниченного индексируемого типа. Следствием этого является то, что нет двух таких объектов одного и того же типа.

Ссылки: анонимный тип 3.3.1, в некотором порядке 1.6, граница диапазона 3.5, диапазон 3.5, дискретный тип 3.5, имя 4.1, компонента 3.3, обозначение типа 3.3.2, объект 3.2, ограничение 3.3, описание типа 3.3.1, определение типа 3,3.1, подтип 3.3, Предвыполнение 3.1, 3.9, тип 3.3, указание подтипа 3.3.2.

3.6.1. ОГРАНИЧЕНИЯ ИНДЕКСА И ДИСКРЕТНЫЕ ДИАПАЗОНЫ

Ограничение индекса определяет диапазон возможных значений каждого индекса индексируемого типа и, таким образом, соответствующие границы массива.

Для дискретного диапазона, использованного в определении ограниченного индексируемого типа и определенного диапазоном, неявное преобразование к предопределенному типу INTEGER производится в том случае, если каждая граница — это либо числовой литерал, либо именованное число, либо атрибут, а тип обеих границ (до неявного преобразования) является универсальным-целым. В остальных случаях обе границы должны быть одного и того же дискретного типа, отличного от типа универсальный-целый', этот тип должен определяться независимо от контекста, но с учетом того, что тип должен быть дискретным и обе границы должны иметь один и тот же тип. Эти правила применимы также к дискретному диапазону, используемому в правиле итерации (см. 5.5) или в описании семейства входов (см. 9.5).

Если ограничение индекса следует за обозначением типа в указании подтипа, то тип и подтип, указанный обозначением типа, не должен содержать ограничение индекса. Обозначение типа должно указывать либо неограниченный индексируемый тип, либо ссылочный тип, указываемый тип которого — такой же индексируемый тип. В любом случае ограничение индекса должно задавать дискретный диапазон для каждого индекса индексируемого типа и тип каждого дискретного диапазона должен быть тем же самым, что и у соответствующего индекса.

Ограничение индекса совместимо с типом, указанным в обозначении типа, если и только если ограничение, определенное каждым дискретным диапазоном, совместимо с соответствующим подтипом индекса. Если какой-нибудь из дискретных диапазонов определяет пустой диапазон, то ограниченный таким образом массив является пустым массивом, не имеющим компонент. Значение массива удовлетворяет ограничению индекса, если в каждой позиции индекса значение массива и ограничение индекса имеют одни и те же границы индекса. (Заметим, однако, что присваивание и некоторые другие операции над массивами включают неявное преобразование подтипа.)

Границы каждого массива определены следующим образом:

• Для заданной описанием объекта переменной указание подтипа соответствующего описания объекта должно определять подтип ограниченного индексируемого типа (и, таким образом, границы). То же самое требуется от указания подтипа описания компоненты, если тип

компоненты записи — индексируемый тип, а также от указания подтипа компоненты определения индексируемого типа, если тип компонент массива является сам индексируемым типом.

• Для заданной описанием объекта константы индексируемого типа границы определены начальным значением, если подтип константы не ограничен; иначе они определены подтипом (в последнем случае начальное значение — это результат неявного преобразования подтипа). То же правило применимо к формальному параметру настройки вида in.

• Для указанного ссылочным значением массива границы должны быть определены генератором, создающим массив. (Созданный объект ограничен соответствующими значениями границ.)

• Для формального параметра подпрограммы или входа границы получены от соответствующего фактического параметра. (Формальный параметр ограничен соответствующими зна- ' чениями границ.)

• Для описания переименования и для формального параметра настройки вида in out границы берутся у переименованного объекта или у соответствующего фактического параметра настройки.

Порядок вычисления дискретных диапазонов при предвыполнении ограничения индекса в языке не определен.

Примеры описания массивов, включающих ограничения индексов:

BOARD     : MATRIX(1 .. 8,  1 .. 8); -- СМ. 3.6RECTANGLE : MATRIX(1 .. 20, 1 .. 30);INVERSE   : MATRIX(1 .. N,  1 .. N); -- N не обязательно статическоеFILTER : BIT_VECTOR(0 .. 31);

Пример описания массива с ограниченным индексируемым подтипом:

MY_SCHEDULE : SCHEDULE; — все массивы типа SCHEDULE! имеют одни и те же границы Пример именуемого типа с компонентой индексируемого типа:

type VARLINE(LENGTH : INTEGER) is    record       IMAGE : STRING(1 .. LENGTH);   end record;NULL_LINE : VAR_LINE(0); -- NULL_LINE.IMAGE пустой массив

Примечание. Предвыполнение указания подтипа, состоящего из обозначения типа, за которым следует ограничение индекса, контролирует совместимость ограничения индекса с обозначением типа (см. 3.3.2).

Все компоненты массива имеют один и тот же подтип. В частности, для массива компонент, которые являются одномерными массивами, это означает, что все компоненты имеют одни и те же границы и, следовательно, одинаковую длину.

Ссылки: вид 12.1.1, вход 9.5, выражение 4.4, генератор 4.8, граница диапазона 3.5, граница массива 3.6, диапазон 3.5, дискретный диапазон 3.6, имя 4.1, индекс 3.6, индексируемый тип 3.6, компонента записи 3.7, компонента массива 3.6, константа 3.2.1, начальное значение 3.2.1, неограниченный индексируемый тип 3.6, неограниченный подтип 3.3, обозначение типа 3.3.2, объект 3.2, ограничение индекса 3.6.1, ограниченный индексируемый подтип 3.6, описание компоненты 3.7, описание объекта 3.2.1, описание переименования 8.5, описание семейства входов 9.5, определение индексируемого типа 3.6, определение ограниченного индексируемого типа 3.6, определение ссылочного типа 3.8, параметр настройки 12.1, переменная 3.2, подпрограмма 6, подтип индекса 3.6, подтип ограниченного индексируемого типа 3.6, подтип результата 6.1, правило итерации 5.5, предопределенный тип С, преобразование 4.6, преобразование подтипа 4.6, пустой диапазон 3.5, совместимый 3.3.2, ссылочное значение 3.8, ссылочный тип 3.8, тип универсальный целый 3.5, удовлетворять 3.3, указание подтипа 3.3.2, указываемый тип 3.8, указывать 3.8, универсальный тип 4.10, фактический параметр 6.4.1, фактический параметр настройки 12.3, формальный параметр 6.1, формальный параметр настройки 12.1, 12.3, функция 6.5, целый литерал 2.4, целый тип 3.5.4.

3.6.2. ОПЕРАЦИИ НАД ИНДЕКСИРУЕМЫМИ ТИПАМИ

Базовые операции над индексируемым типом включают присваивание, агрегаты (если индексируемый тип не является лимитируемым личным типом), проверку принадлежности, индексируемые компоненты, квалификацию и явное преобразование; для одномерных массивов базовые операции включают также отрезки и строковые литералы, если тип компонент —• символьный тип.

Если А — объект, являющийся массивом, значением массива или подтипом ограниченного индексируемого типа, то базовые операции включают также атрибуты, которые перечислены ниже. Эти атрибуты недопустимы для неограниченного индексируемого типа. Аргумент N, использованный в обозначении атрибута для N-ro измерения массива, должен быть положительным статическим выражением типа универсальный-целый и не больше размерности массива.

A'FIRST

Вырабатывает нижнюю границу диапазона первого индекса. Значение этого атрибута имеет тот же тип, что и эта граница.

A'FIRSTfN)

Вырабатывает значение нижней границы диапазона N-ro индекса. Значение этого атрибута имеет тот же тип, что и эта нижняя граница.

A'LAST

Вырабатывает верхнюю границу диапазона первого индекса. Значение этого атрибута имеет тот же тип, что и эта верхняя граница.

A'LAS^N)

Вырабатывает верхнюю границу диапазона М-го индекса. Значение этого атрибута имеет тот же тип, что и эта верхняя граница.

A'RANGE

Вырабатывает диапазон первого индекса, т. е. диапазон A'FIRST.. A'LAST.

A'RANGE(N)

Вырабатывает диапазон N-ro индекса, т. е. диапазон A'FIRST(N) . . A'LAST(N).

A'LENGTH

Вырабатывает количество значений в диапазоне первого индекса (нуль для пустого диапазона). Значение этого атрибута имеет тип универсальный-целый.

A'LENGTH(N)

Вырабатывает количество значений в диапазоне N-ro индекса (нуль для пустого диапазона). Значение этого атрибута имеет тип универсальный-целый.

Кроме того, для индексируемого типа или подтипа Т определены атрибуты Т'ВАSЕ и T'SIZE (см. 3.3.3), а для массива А определены атрибуты A'SIZE и A'ADDRESS (см. 13.7.2).

Кроме базовых в состав операций над индексируемым типом входят предопределенные операции сравнения на равенство или неравенство, если индексируемый тип не является лимитируемым типом. Для одномерных массивов к этим операциям относится катенация, если индексируемый тип не является лимитируемым типом; если тип компоненты — дискретный тип, то операции включают также все предопределенные операции отношения; если тип компоненты — логический тип, то операции также включают унарную логическую операцию отрицания и логические операции.

Примеры (использующие массивы, описанные в примерах раздела 3.6.1):

-- FILTER'FIRST = 0         FILTER'LAST = 31         FILTER'LENGTH == 32-- RECTANGLE'LAST(1) = 20   RECTANGLE'LAST(2) = 30

Примечание. Атрибуты A'FIRST и A'FIRST(1) вырабатывают одно и то же значение. То же можно сказать об атрибутах A'LAST, A'RANGE и A'LENGTH. Для приведенных атрибутовудовлетворяются следующие соотношения (исключая пустой массив) если тип индекса — целый тип:

A'LENGTH = A'LAST - A'FIRST + 1 A'LENGTH(N) = A'LAST(N) - A'FIRST(N) + 1

Индексируемый тип — лимитируемый, если тип его компонент — лимитируемый (см. 7.4.4).

Ссылки: агрегат 4.3, атрибут 4.1.4, базовая операция 3.3.3, граница диапазона 3.5, индекс 3.6, индексированная компонента 4.1.1, индексируемый тип 3.6, квалифицированное выражение 4.7, лимитируемый тип 7.4.4, логическая операция 4.5, 4.5,1, неограниченный индексируемый тип 3.6, обозначение 6.1, объект 3.2, ограниченный индексируемый тип 3.6, операция кате-нации 4.5, 4.5.2, операция отношения 4.5, 4.5.2, операция отрицания 4.5, 4.5.6, отрезок 4.1.2, подкомпонента 3.3, предопределенная операция 4.5, преобразование 4.6, присваивание 5.2, проверка принадлежности 4.5, 4.5.2, пустой диапазон 3.5, размерность 3.6, символьный тип 3.5.2, статическое выражение 4.9, строковый литерал 2.6, тип 3.3, универсальный тип 4.10, универсальный целый тип 3.5.4.

3.6.3. СТРОКОВЫЙ ТИП

Значения предопределенного типа STRING — это одномерные массивы компонент предопределенного типа CHARACTER, индексируемые значениями предопределенного подтипа POSITIVE:

subtype POSITIVE is INTEGER range 1 .. INTEGER'LAST;

type STRING is array(POSITIVE range 0) of CHARACTER;

Примеры:

STARS : STRING(1 .. 120) := (1 .. 120 => '*' ); QUESTION : constant STRING := "HOW MANY CHARACTERS?"; -- QUESTION'FIRST = 1, QUESTION'LAST = 20 (число СИМВОЛОВ)ASK_TWICE : conatant STRING := QUESTION & QUESTION;NINETY_SIX : constant ROMAN := "XCVI"; -- см. 3.6

Примечание. Строковые литералы (см. 2.6 и 4.2) — базовые операции над типом STRING и любым другим одномерным индексируемым типом, тип компонент которого — символьный тип. Операция катенации — предопределенная операция над типом STRING и для одномерных индексируемых типов; она представляется знаком &. Операции отношения <, < =, > и > = определены для значений этих типов в соответствии с лексикографическим порядком (см. 4.5.2).

Ссылки: агрегат 4.3, индекс 3.6, лексикографический порядок 4.5.2, массив 3.6, операция катенации 4.5, 4.5.3, операция отношения 4.5, 4.5.2, подтип 3.3, позиционный агрегат 4.3, предопределенная операция 4.5, предопределенный тип С, размерность 3.6, символьный тип 3.5.2, строковый литерал 2.6, тип 3.3, тип компоненты (массива) 3.6.