Кроме базовых, в состав операций над фиксированным типом входят операции отношения и следующие предопределенные арифметические опе­рации: унарные и бинарные аддитивные операции — и +, мультипликатив­ные операции * и / и операция abs.

Операции над подтипом — это соответствующие операции типа, кроме следующих: присваивания, проверки принадлежности, квалификации, яв­ного преобразования и атрибутов первой группы; результат этих операций определен в терминах подтипа.

Примечание. Значение атрибута T'FORE зависит только от диапазона подтипа Т. Значение атрибута T'AFT зависит только от значения T'DELTA. Между атрибутами фиксированного типа существуют следующие соотношения:

T'LARGE = (2 **T'MANTISSA -1) * T'SMALL

T'SAFELARGE = T'BASE'LARGE

T'SAFESMALL_= T'BASE'SMALL

  1. Индексируемые типы

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

определение—индексируемого—типа : : =

определение—неограниченного—индексируемого—типа

| определение—ограниченного._индексируемого„типа определение_неограниченного_индексируемого_типа : : = array (определение—подтипа_индекса

{, определение—подтипа—индекса}) of указание—подтипа—ко .мионенга

определение—ограниченного—индексируемого—типа : : = array ограничение_индекса of

указание_подтипа_компонента определение_подтипа_индекса : : = обозначение_типа range < >

ограничение_индекса : : =

(дискретный , диапазон {, дискретный—диапазон}) дискретный_диапазон : : =

указание-дискретного-Подтипа | диапазон

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

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

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

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

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

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

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

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

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

type ВЕКТОР is array (INTEGER range < >) of ВЕЩЕСТВ;

type МАТРИЦА is array (INTEGER range < >, INTEGER range < >) of ВЕЩЕСТВ;

type ВЕКТОР БИТ is array (INTEGER range < >) of BOOLEAN;

type РИМСКИЙ is array (POSITIVE range < >) of РИМСКАЯ ЦИФРА;

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

type ТАБЛИЦА is array (1 . . 10) of INTEGER;

type РАСПИСАНИЕ is array (ДЕНЬ) of BOOLEAN;

type СТРОЧКА is-array (1. . МАКС_РАЗМЕР_СТРОЧКИ) of CHARACTER;

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

РЕШЕТКА: array (1. .80, 1. .100) of BOOLEAN;

СМЕСЬ: array (ЦВЕТ range КРАСНЫЙ. .ЗЕЛЕНЫЙ) of BOOLEAN;

СТРАНИЦА: array (1. .50) of СТРОЧКА; - -массив массивов.

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

type Т is array (POSITIVE range МИН. .МАКС)

of КОМПОНЕНТОВ;

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

subtype подтип индекс is POSITIVE range МИН . . МАКС;

type индексируемый_тип is array (подтипиндекса range < >) of КОМПОНЕНТОВ;

subtype Т is индексируемый—тип (подтип-индекса);

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

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

  1. Ограничения индекса и дискретные диапазоны

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

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

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

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

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

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

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

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

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

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

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

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

ПУЛЬТ: МАТРИЦА (1. .8, 1. .8); - -см. 3.6

ПРЯМОУГОЛЬНИК: МАТРИЦА (1. .20, 1. .30);

ОБРАТНАЯ: МАТРИЦА (1. .К, 1. .К) ; - - К не обязательно статическое

ФИЛЬТР: ВЕКТОР_БИТ (0. .31) ;

Пример описания массива с ограниченным индексируемым подтипом: МОЕ_РАСПИСАНИЕ: РАСПИСАНИЕ; - - все массивы типа

- - РАСПИСАНИЕ имеют одни и те же границы.

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

type ПЕРЕМ_СТРОЧКА (ДЛИНА: INTEGER) is record

ОБРАЗ: STRING (№. .ДЛИНА) ;

end record;

ПУСТАЯ_СТРОЧКА: ПЕРЕМ_СТРОЧКА (0);

- - ПУСТАЯ СТРОЧКА. ОБРАЗ - пустой массив

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

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

  1. О п е р а ц и и над индексируемыми типами

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

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

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

A'FIRST (К) Вырабатывает значение нижней границы диапазона К-го ин­декса. Значение этого атрибута имеет тот же тип, что и эта нижняя граница.

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

A'LAST (К) Вырабатывает значение верхней границы диапазона К-го ин­декса. Значение этого атрибута имеет тот же тип, что и эта верхняя граница.

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

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

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

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

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

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

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

  • - ФИЛЬТР'ИДЗТ = О

  • -ФИЛЬТР'LAST = 31

  • - ФИЛЬТР'LENGTH =32

  • -ПРЯМОУГОЛЬНИК'ЕАЗТ(І) = 20

- ПРЯМОУГОЛЬНИКТАБТ (2) = 30Примечание, Атрибуты A'FIRST и A'FIRST (1) вырабатывают одно и то же значе­ние. То же можно сказать об атрибутах A'LAST, A'RANGE и A'LENGTH. Для приве­денных атрибутов удовлетворяются следующие соотношения (исключая пустой мас­сив) , если тип индекса - целый тип: