Кроме базовых, в состав операций над фиксированным типом входят операции отношения и следующие предопределенные арифметические операции: унарные и бинарные аддитивные операции — и +, мультипликативные операции * и / и операция 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
Индексируемые типы
Объект индексируемого типа (массив) — это составной объект, содержащий компоненты одного и того же подтипа. В имени компонента массива используется одно или несколько индексных значений, принадлежащих заданным дискретным типам. Значение массива — это составное значение, состоящее из значений его компонентов.
определение—индексируемого—типа : : =
определение—неограниченного—индексируемого—типа
| определение—ограниченного._индексируемого„типа определение_неограниченного_индексируемого_типа : : = 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 индексируемый—тип (подтип-индекса);
где подтип_индекса и индексируемый_тип оба анонимны. Следовательно, Т - имя подтипа, и все объекты, описанные с этим обозначением типа, - массивы, имеющие одни и те же границы. Аналогичные преобразования применяются к многомерным массивам.
Подобное преобразование применяется к объекту, описание которого включает определение ограниченного индексируемого типа. Следствием этого является то, что нет двух таких объектов одного и того же типа.
Ограничения индекса и дискретные диапазоны
Ограничение индекса определяет диапазон возможных значений каждого индекса индексируемого типа и, таким образом, соответствующие границы массива.
Для дискретного диапазона, использованного в определении ограниченного индексируемого типа и определенного диапазоном, неявное преобразование к предопределенному типу 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).
Все компоненты массива имеют один и тот же подтип. В частности, для массивов, компоненты которых являются одномерными массивами, это означает, что все компоненты имеют одни и те же границы, и, следовательно, одинаковую длину.
О п е р а ц и и над индексируемыми типами
Базовые операции над индексируемым типом включают присваивание, агрегаты (если индексируемый тип не является лимитируемым типом), проверку принадлежности, индексируемые компоненты, квалификацию и явное преобразование; для одномерных массивов базовые операции включают также отрезки и строковые литералы, если тип компонентов — символьный тип.
Если А — объект, являющийся массивом, значение массива или подтип ограниченного индексируемого типа, то базовые операции включают также атрибуты, которые перечислены ниже. Эти атрибуты недопустимы для неог- ранйченного индексируемого типа. Аргумент К, использованный в обозначении атрибута для К-го измерения массива, должен быть положительным (ненулевым) статическим выражением типа универсальный-Целый и не больше размерности массива.
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. Для приведенных атрибутов удовлетворяются следующие соотношения (исключая пустой массив) , если тип индекса - целый тип: