Справочное руководство по языку Ада-83


Спецификаторы представления записей - часть 2


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

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

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

Пример:

WORD : constant := 4; -- квант памяти — это байт; в слове 4 байт type STATE is (A, M, W, Р); type MODE is (FIX, DEC, EXP, SIGNIF);

type BYTE_MASK is array (0 .. 7) of BOOLEAN; type STATE_MASK is array (STATE) of BOOLEAN; type MODE_MASK is array (MODE) of BOOLEAN;

type PROGRAM_STATUS_WORD is

record

SYSTEM_MASK : BYTE_MASK; PROTECTION_KEY : INTEGER range 0 .. 3; MACHINE_STATE : STATE_MASK; INTERRUPT_CAUSE : INTERRUPTION_.CODE; ILC : INTEGER range 0 .. 3; CC : INTEGER range 0 .. 3; PROGRAM_MASK : MODE_MASK; INST_ADDRESS : ADDRESS; end record;

for PROGRAM_STATUS_WORD use

record at mod 8; SYSTEM_MASK at 0*WORD range 0 .. 7; PROTECTION_KEY at 0*WORD range 10 .. 11; -- биты 8, 9 не использует MACHINE_STATE at 0*WORD range 12 .. 15; INTERRUPT-CAUSE at 0+WORD range 16 .. 31; ILC at 1*WORD range 0 .. 1; -- второе слово СС at 1*WORD range 2 .. 3; PROGRAM_MASK at 1*WORD range 4 .. 7; INST_ADDRESS at 1*WORD range 8 .. 31; end record;




Начало  Назад  Вперед