A'LENGTH = A'LAST - A'FIRST +1

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

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

  1. С т р о к о в ы й тип

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

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

type STRING is array (POSITIVE range < >) of CHARACTER;

Примеры:

ЗВЕЗДОЧКИ: STRING (1. .120): = (1. .120= >

ВОПРОС: constant STRING : = ’’СКОЛЬКО СИМВОЛОВ?”;

  1. - BOnPOC'FIRST = 1, BOnPOC'LAST = 17 (число символов) ДВОЙНОЙ_ВОПРОС: constant STRING: = ВОПРОС & ВОПРОС;

ДЕВЯНОСТОШЕСТЬ: constant РИМСКИЙ: = ”XCVI”; --см. 3.6

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

3.7. Именуемые типы

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

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

record

СПИСОК-Компонентов

end record

список—компонентов : : =

описание_компонента {описание—компонента }

I {описание—компонента} раздел_вариантов | null;

описание—компонента : : =

список—идентификаторов : определение—подтипа—компонента

[ := выражение] ;

определение_подтипа_компонента : : = указание_подтипа

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

Описание компонента с несколькими идентификаторами эквивалентно последовательности единичных описаний компонентов, как пояснено в разд. 3.2. Каждое единичное описание компонента описывает компонент за­писи, подтип которого задан определением подтипа компонента.

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

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

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

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

Примеры описаний именуемого типа:

type ДАТА is

record

ДЕНЬ: INTEGER range 1. .31;

МЕСЯЦ: ИМЯ_МЕСЯЦА;

ГОД: INTEGER range 0. .4000;

end record;

type КОМПЛЕКСНЫЙ is

record

ВЕЩ: ВЕЩЕСТВ: = 0.0;

МНИМ: ВЕЩЕСТВ: = 0.0;

end record;

Примеры переменных именуемого типа:

ЗАВТРА, ВЧЕРА: ДАТА-

А, В, С: КОМПЛЕКСНЫЙ;

- - компоненты А, В и С неявно инициализированы нулем.

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

В отличие от компонентов массива компоненты записи не обязательно имеют один и тот же тип.

  1. Дискриминанты

Раздел дискриминантов специфицирует дискриминанты типа. Дискри­минант записи - это компонент записи. Тип дискриминанта должен быть дискретным.

раздел_дискриминантов : : =

(спецификация_дискриминанта

спецификация_дискриминанта})

спецификациЯ—Дискриминанта : : =

список_идентификаторов : обозначение_типа

[: = выражение]

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

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

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

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

Компонент называется зависимым от дискриминанта, если он - либо компонент записи, описанный в разделе вариантов, либо компонент записи, чье определение подтипа компонента зависит от дикриминанта, либо, нако­нец, один из подкомпонентов компонента, который сам зависит от дискри­минанта.

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

Непосредственное присваивание значения дискриминанту объекта недо­пустимо; более того, дискриминант недопустим как фактический параметр вида in out или out, либо как фактический параметр настройки вида in out. Единственным допустимым способом изменения значения дискриминанта переменной является присваивание (полного) значения самой переменной. Аналогично, присваивание самой переменной является единственным до­пустимым путем изменения ограничения одного из ее компонентов, если определение подтипа компонента зависит от дискриминанта переменной.

Предвыполнение раздела дискриминантов не имеет другого эффекта.

Примеры:

type БУФЕР (РАЗМЕР: РАЗМЕР_БУФЕРА: = 100) is - - см. 3.5.4 record

ПОЗ: РАЗМЕР БУФЕРА: = 0;

ЗНАЧЕНИЕ: STRING (1. .РАЗМЕР);

end record;

type КВАДРАТ (СТОРОНА: INTEGER) is

record

МАТР: МАТРИЦА (1. .СТОРОНА, 1. .СТОРОНА) ; - - см. 3.6

end record;

type ДВОЙНОЙ _КВАДРАТ (ЧИСЛО: INTEGER) is record

ЛЕВЫЙ: КВАДРАТ (ЧИСЛО);

ПРАВЫЙ:КВАДРАТ (ЧИСЛО):

end record;

type ЭЛЕМЕНТ (ЧИСЛО: POSITIVE) is

record

СОДЕРЖАНИЕ: INTEGER;

- - компонент не зависит от дискриминанта

end record;

  1. О г р а н и ч е н и я дискриминантов

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

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

(сопоставление_дискриминанта

сопоставление .дискриминанта})

сопоставление дискриминанта : : =

[простое. _имя...дпскрглмпн«И7И

{I простое _имя_дис/сриминан та} = >] выражение

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

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

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

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

Начальные значения дискриминантов объекта, имеющего тип с дискри­минантами, определяются следующим образом: ’

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

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

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

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

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

Порядок вычислений выражений, данных в сопоставления^ дискрими­нантов, при предвыполнении ограничения дискриминанта в языке не опре­делен; выражение именованного сопоставления вычисляется по одному разу для каждого именованного дискриминанта.

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

БОЛЬШОЙ: БУФЕР (200); - - ограничен, всегда 200 символов

  1. - (явное значение дискриминанта)

СООБЩЕНИЕ: БУФЕР; - - неограничен, вначале 100 символов

  1. - (значение дискриминанта по умолчанию)

БАЗИС: КВАДРАТ (5); - - ограничен, всегда 5 на 5

НЕПРАВИЛЬНЫЙ: КВАДРАТ; - -неправильно, КВАДРАТ должен быть ограничен

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