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

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

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

Если производный тип или личный тип описаны непосредственно в ви­димом разделе пакета, то в этом разделе этот тип не должен использоваться как родительский'тип в определении производного типа (для личных типов см. также разд. 7.4.1).

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

Примеры:

type ЛОКАЛЬНАЯ-КООРДИНАТА is new КООРДИНАТА; - - два различных типа type СЕРЕДИНА-НЕДЕЛИ is new ДЕНЬ range ВТР . . ЧТВ; - - см. 3.5.1 type СЧЕТЧИК is new POSITIVE; - - тот же диапазон, что и POSITIVE type СПЕЦИАЛЬНЫЙКЛЮЧ is new УПРАВЛЕНИЕ_ПО_КЛЮЧУ . КЛЮЧ;

- - см. 7.4.2

  • - Производные подпрограммы имеют следующие спецификации:

  • - procedure ДАЙ_КЛЮЧ (К: out СПЕЦИАЛЬНЫЙ_КЛЮЧ) ;

  • - function (X, У; СПЕЦИАЛЬНЫЙ_КЛЮЧ) return BOOLEAN;

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

Скрытие производной подпрограммы допустимо даже в одной и той же зоне опи­сания (см. 8.3). Производная подпрограмма скрывает предопределенную операцию, имеющую тот же профиль типа параметра и результата (см. 6.6).

Описание настраиваемой подпрограммы не наследуется, поскольку оно описывает настраиваемый модуль, а не подпрограмму. С другой стороны, конкретизация настраи­ваемой подпрограммы является (ненастраиваемой) подпрограммой, которая являет­ся наследуемой, если она удовлетворяет требованиям наследуемости подпрограмм.

Если родительский тип является логическим, то предопределенные операции от­ношения над производным типом дают результаты предопределенного типа BOOLEAN (см. 4.5.2).

Если спецификатор представления дан для родительского типа и помещен за опи­санием производного типа, то соответствующий спецификатор представления непри­меним к производному типу; следовательно, для такого производного типа допуска­ется явный спецификатор представления.

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

3.5. Скалярные типы

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

ограничение_диапазона : : = range диапазон

диапазон : : = атрибут ^диапазона

I простое_выражение .. простое_выражение

Диапазон определяет подмножество значений скалярного типа. Диапа­зон Л . . П определяет значения от Л до П включительно, если истинно отно­шение Л <= П. Значения Л и П называются соответственно нижней границей и верхней границей диапазона. Значение X удовлетворяет ограничению диа­пазона, если оно принадлежит диапазону; говорят, что значение X принадле­жит диапазону, если одновременно истинны отношения Л <= X и X <= П. Пустой диапазон — это диапазон, для которого истинно отношение П < Л; пустому диапазону не принадлежит никакое значение. Операции <= и < в вышеприведенных определениях являются предопределенными операциями над скалярными типами.

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

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

Атрибуты.

Для любого скалярного типа Т или для любого подтипа Т скалярного типа определены следующие атрибуты:

T'FIRST Вырабатывает значение нижней границы Т. Значение этого ат­рибута имеет тип Т;

T'LAST Вырабатывает значение верхней границы Т. Значение этого ат­рибута имеет тип Т.

Примечание. Индексирование и правила итерации используют значения дискрет­ных типов.

  1. Перечислимые типы

Определение перечислимого типа задает перечислимый тип.

определение_перечислимого_типа : : =

(спецификация_литерала_перечисления

<, спецификация_литерала_перечисления})

спецификациялитерала_перечисления : : =

литерал_перечисления

литерал-перечисления : : =

идентификатор | символьный_литерал

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

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

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

Примеры:

type ДЕНЬ is (ПНД, ВТР, СРД, ЧТВ, ПТН, СББ, ВСК) ;

type МАСТЬ is (ТРЕФЫ, БУБНЫ, ЧЕРВЫ, ПИКИ);

type РОД is (М, Ж) ;

type УРОВЕНЬ is (НИЗШИЙ, СРЕДНИЙ, СРОЧНЫЙ) ;

type ЦВЕТ is (БЕЛЫЙ, КРАСНЫЙ, ЖЕЛТЫЙ, ЗЕЛЕНЫЙ, ГОЛУБОЙ, КОРИЧНЕВЫЙ, ЧЕРНЫЙ);

type СВЕТ is (КРАСНЫЙ, ЯНТАРНЫЙ, ЗЕЛЕНЫЙ):

- - КРАСНЫЙ и ЗЕЛЕНЫЙ совмещены.

type ШЕСТНАДЦАТЕРИЧНЫЕ is ('А','В','С', 'D', 'е', 'F');

type СМЕШАННЫЙ is ('А', 'в', В, НИЧТО,'?','%') ;

subtype ДЕНЬ НЕДЕЛИ is ДЕНЬ range ПНД . .ПТН;

subtype КОЗЫРЬ is МАСТЬ range ЧЕРВЫ . . ПИКИ;

subtype РАДУГА is ЦВЕТ rangy КРАСНЫЙ . . ГОЛУБОЙ;

- - КРАСНЫЙ - цвет, но не свет.

Примечание. Если литерал перечисления встречается в контексте, недостаточном для определения типа литерала, то один из путей разрешения неоднозначности - это применение квалифицированного выражения с именем перечислимого типа (см. 8.7).

  1. Символьные типы

Перечислимый тип называется символьным, если хотя бы один из его литералов перечисления является символьным литералом. Предопределен­ный тип CHARACTER — символьный тип, значения которого представляют собой 195 символов стандартного набора. Каждый из 161 графических сим­волов этого символьного набора обозначен соответствующим символьным литералом.

Пример:

type РИМСКАЯ_ЦИФРА is (Т, V, 'х', 'Ь', 'С', 'D', 'М');

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

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

  1. Л о г и ч е с к и е типы

Существует предопределенный перечислимый тип, именуемый BOO­LEAN. Он содержит два литерала FALSE и TRUE, упорядоченные отноше­нием FALSE < TRUE. Логический тип — это тип BOOLEAN или производ­ный, непосредственно или косвенно, от логического типа.

  1. Целые типы

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

определение_целого_типа : : = ограничение_диапазона

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

Описание типа в форме:

type Т is range Л . . П;

по определению эквивалентно следующим описаниям:

type целый _тип is new предопределенный_целый_тип;

subtype Т is целый _тип range целый _тип (Л) . . целый_тип (П): где целый_тип — это анонимный тип, а предопределенный целый тип неявно выбран реализацией и содержит значения от Л до П включительно. Описание целого типа неправильно, если ни один из предопределенных целых типов не удовлетворяет этому требованию, за исключением типа универсальный_ целый. Предвыполнение описания целого типа состоит из предвыполнения эквивалентных описаний типа и подтипа.

Предопределенные целые типы включают тип INTEGER. Реализация мо­жет также иметь предопределенные типы SHORT_INTEGER и LONG_INTE- GER, диапазоны которых соответственно (существенно) уже и шире, чем у типа INTEGER. Диапазон для значений этих типов должен быть симметрич­ным относительно нуля, кроме наименьшего из отрицательных значений, которое может существовать в некоторых реализациях. Базовым для каж­дого из этих типов является он сам.

Целый литерал — это литерал анонимного предопределенного целого ти­па, который в данном стандарте называется универсальным_целым. Другие целые типы не имеют литералов. Однако для каждого целого типа сущест­вует неявное преобразование универсального _целого значения в соответст­вующее значение (если оно есть) целого типа. Обстоятельства, в которых применяются такие неявные преобразования, описаны в разд. 4.6.

Номер позиции целого значения — это соответствующее значение типа универсальный _целый.

Для всех целых типов предопределены одни и те же арифметические операции (см. 4.5). Исключение NUMERIC_ERROR возбуждается при вы­полнении операции (в частности, неявного преобразования), которая не может передать корректный результат (т. е. значение, соответствующее математическому результату, не является значением целого типа). Однако от реализации не требуется возбуждения исключения NUMERIC_ERROR, если операция является частью большего выражения, результат которого может быть вычислен корректно, как пояснено в разд. 11.6.

Примеры:

type НОМЕР_СТРАНИЦЫ is range 1 .. 2_000;

type РАЗМЕР_СТРОЧКИ is range 1 . . МАКС_РАЗМЕР_СТРОЧКИ;

subtype МАЛОЕ_ЦЕЛ is INTEGER range -10 . . 10;

subtype УКАЗ_СТОЛБЦА is РАЗМЕР_СТРОЧКИ range 1 . . 10;

subtype РАЗМЕР_БУФЕРА is INTEGER range 0 . . МАКС;

Примечание. Имя в описании целого числа - это имя подтипа. С другой стороны, предопределенные операции над целым типом определяют результат, который принад­лежит диапазону, определяемому родительским предопределенным типом; такой ре­зультат необязательно принадлежит описанному подтипу, и попытка присвоить такой результат переменной целого подтипа возбуждает исключение CONSTRAINT-ERROR.

Наименьшее (наибольшее по модулю отрицательное) значение, поддержанное реализацией для предопределенных целых типов, есть именованное число SYSTEM. MININT, анаиболыиее (из положительных) значение - SYSTEM.MAXINT (см. 13.7).

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

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

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

Первая группа атрибутов вырабатывает характеристики подтипа Т. Эта группа включает атрибут BASE (см. 3.3.3), атрибуты FIRST и LAST (см. 3.5), атрибут представления SIZE (см. 13.7.2) и атрибут WIDTH, определен­ный следующим образом: