3.7. ИМЕНУЕМЫЕ ТИПЫ

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

определение-именуемого-типа::=    record       список-компонент    end recordсписок_компонент::=    описание_компоненты {описание_компоненты}     |{ описание_компоненты} раздел_вариантов | null;описание_компоненты ::=    список_идентификаторов : определение_подтипа_компоненты [:= выражение]; определение_подтипа_компоненты ::= указание_подтипа

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

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

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

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

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

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

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

type DATE is    record       DAY   : INTEGER range 1 ..31;      MONTH : MONTHNAME;      YEAR  : INTEGER range 0 .. 4000;   end record;type COMPLEX is    record       RE : REAL := 0.0;      IM : REAL := 0.0;   end rocord;

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

TOMORROW, YESTERDAY : DATE;А, В, С : COMPLEX;-- компоненты А, В и С неявно инициализированы нулем

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

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

Ссыпки: выражение 4.4, дискриминант 3.3, зависит от дискриминанта 3.7.1, идентификатор 2.3, имя 4.1, компонента 3.3, лимитируемый тип 7.4.4, обозначение типа 3.2.2, объект 3.2, ограничение 3.3, описание 3.1, подтип 3.3, Предвыполнение 3.9, раздел вариантов 3.7.3, раздел дискриминантов 3.7, 3.7.1, составное значение 3.3, составной ограничитель присваивания 2.2, список идентификаторов 3.2, тип 3.3.

3.7.1. ДИСКРИМИНАНТЫ

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

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

(спецификация-дискриминанта {; спецификация-дискриминанта})

спецификация-дискриминанта ::=

список-идентификаторов : обозначение-типа [:= выражение]

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

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

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

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

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

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

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

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

Примеры:

type BUFFER(SIZE : BUFFER_SIZE := 100) is -- см. 3.5.4    record       POS : BUFFER_SIZE := 0;      VALUE : STRING(1 .. SIZE);    end record;type SQUARE(SIDE : INTEGER) is    record       MAT : MATRIX(1 .. SIDE, 1 .. SIDE); --CM. 3.6    end record:type DOUBLESQUARE(NUMBER : INTEGER) is    record      LEFT : SQUARE (NUMBER);       RIGHT : SQUARE (NUMBER);   end record;

type ITEM(NUMBER : POSITIVE) is    record      CONTENT : INTEGER;      --  компонента не зависит от дискриминанта    end record;

Ссылки: выражение 4.4, границы диапазона 3.5, дискретный тип 3.5, дискриминант 3.3, идентификатор 2.3, именуемый тип 3.7, имя 4.1, компонента 3.3, компонента записи 3.7, личный тип 7.4, настраиваемый формальный тип 12.1, неполное описание типа 3.8.1, область действия 8.2, обозначение типа 3.3.2, объект 3.2, ограничение дискриминанта 3.7.2, ограничение индекса 3.6.1, описание 3.1, описание компоненты 3.7, описание личного типа 7.4, описание параметра настройки 12.1, описание типа 3.3.1, подкомпонента 3.3, Предвыполнение 3.9, присваивание 5.2, простое имя 4.1, раздел вариантов 3.7.3, составной ограничитель присваивания 2.2, список идентификаторов 3.2, указание подтипа 3.3.2.

3.7.2. ОГРАНИЧЕНИЯ ДИСКРИМИНАНТОВ

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

ограничение-дискриминанта ::=    (сопоставление-дискриминанта {, сопоставление-дискриминанта})сопоставление-дискриминанта ::=    [простое-имя-дискриминанта {|простое-имя-дискриминанта} =>] выражение

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

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

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

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

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

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

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

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

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

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

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

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

LARGE : ВUFFЕР(200); -- всегда ограничен, 200 символов                     -- это явное значение дискриминанта MESSAQE: BUFFER;                      -- не ограничен, вначале 100 символов                     -- это значение дискриминанта по                     -- умолчаниюBASIS : 8QUАRЕ(5);   -- ограничен, всегда 5 на 5 ILLEGAL : SQUARE;    -- неправильно, SQUARE                      -- должен быть ограничен

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

Ссылки: Вид 6.1, вид In out 6.1, вход 9.5, выражение 4.4, выражение по умолчанию для дискриминанта 3.7, вычисление 4.5, генератор 4.8, граница диапазона 3.5, дискриминант 3.3, зависит от дискриминанта 3.7.1, зарезервированное слово 2.9, имя 4.1, компонента 3.3, константа 3.2.1, обозначение типа 3.3.2, указываемый тип 3.8, объект 3.2, ограничение 3.3, ограниченный подтип 3.3, описание 3.1, описание компоненты 3.7, описание объекта 3.2.1, описание переименования 8.5, определение индексируемого типа 3.6, определение ссылочного типа 3.8, переменная 3.2.1, подкомпонента 3.3, подпрограмма 6, подтип 3.3, предвыполнение 3.9, простое имя 4.1, совместимый 3.3.2, составное значение 3.3, ссылочное значение 3.8, ссылочный тип 3.8, тип 3.3, удовлетворять 3.3, указание подтипа 3.3.2, указание подтипа компоненты 3.7, указываемый тип 3.8, указывать 3.8, фактический параметр 6.4.1, фактический параметр настройки 12.3, формальный параметр 6.1, формальный параметр настройки 12.1, 12.3.

3.7.3. РАЗДЕЛЫ ВАРИАНТОВ

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

раздел-вариантов ::=    case простое-имя-дискриминанта is      вариант      {вариант}    end case;вариант ::=    when выбор {|выбор} =>        список_компонентвыбор ::= простое-выражение    |дискретный-диапазон | others  | простое-имя-компоненты

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

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

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

Примеры именуемого типа с разделом вариантов:

type DEVICE is (PRINTER, DISK, DRUM);type STATE is (OPEN, CLOSED);type PERIPHERAL(UNIT : DEVICE := DISK) is   record   STATUS : STATE;    case UNIT is      whenPRINTER =>          LINECOUNT : INTEGER range1 .. PAGESIZE;       when others =>          CYLINDER : CYLINDERINDEX;          TRACK : TRACKNUMBER;       end case;   end record:

Примеры подтипов записей:

subtype DRUMUNIT is PERIPHERAL(DRUM); subtype DISKUNIT is PERIPHERAL(DISK);

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

WRITER : PERIPHERAL(UNIT => PRINTER); ARCHIVE : DISK_UNIT;

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

Ссылки: агрегат записи 4.3.1, агрегат массива 4.3.2, базовый тип 3.3, выражение 4.4, дискретный диапазон 3.6, диапазон 3.5, дискриминант 3.3, именуемый тип 3.7, компонента 3.3, настраиваемый формальный тип 12.1.2, подтип 3.3, простое выражение 4.4, простое имя 4.1, пустой диапазон 3.5, список компонент 3.7, статическое выражение 4.9, статический дискретный диапазон 4.9, статический подтип 4.9.

3.7.4. ОПЕРАЦИИ НАД ИМЕНУЕМЫМИ ТИПАМИ

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

Для любого объекта А типа с дискриминантами базовые операции включают также следующий атрибут:

A'CONSTRAINED

Вырабатывает значение TRUE, если ограничение дискриминанта наложено на объект А или если объект — константа (включая формальный параметр или формальный параметр настройки вида in); вырабатывает значение FALSE в противном случае. Если А — формальный параметр настройки вида in oirt или если А — формальный параметр вида in out или out и данное в соответствующей спецификации параметра обозначение типа обозначает неограниченный тип с дискриминантами, то значение этого атрибута получается из значения атрибута соответствующего фактического параметра. Значение этого атрибута имеет предопределенный тип BOOLEAN.

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

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

Примечание. Именуемый тип ~ лимитируемый, если тип хотя бы одной из его компонент — лимитируемый (см. 7.4.4).

Ссылки: агрегат 4.3, атрибут 4.1.4, базовая операция 3.3.3, вид 6.1, дискриминант 3.3, именуемая компонента 4.1.3, именуемый тип 3.7, квалифицированное выражение 4.7, константа 3.2.1, лимитируемый тип 7.4.4, логический тип 3.5.3, объект 3.2.1, ограничение дискриминанта 3.7.2, операция 3.3, операция отношения 4.5, 4,5.2, подкомпоненТа 3.3, подтип 3.3, предопределенная операция 4.5, предопределенный тип С, преобразование 4.6, присваивание 5.2, проверка принадлежности 4.5, 4.5.2, производный тип 3.4, тип 3.3, фактический параметр 6.4.1, фактический параметр настройки 12.3, формальный параметр 6.1, формальный параметр настройки12.1, 12.3