Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Pascal_lectures_small.doc
Скачиваний:
13
Добавлен:
23.03.2015
Размер:
339.46 Кб
Скачать
      1. Записи с вариантными полями

В некоторых случаях в программе нужно представить сходные, но неодинаковые объекты. Часть атрибутов у них одинакова, часть отличается. Конечно, можно для них определить различные типы записей, но это не всегда удобно, поскольку сходство объектов подразумевает однотипность некоторых операций над ними, по крайней мере, в отношении одинаковых атрибутов. Представление таких объектов разными типами записей может потребовать дублирования однотипных операций для разных типов записей и отдельного выполнения этих операций для каждого из наборов записей.

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

<конструкция записи с вариантными полями>::="Record" [<фиксированная часть>"];"<вариантная часть> "End".

<фиксированная часть>::=<описание полей>{";"<описание полей>}.

<вариантная часть>::="Case" [<поле-переключатель>":"] <имя типа переключателя> "of" <вариант> {";"<вариант>}.

<вариант>::= (<константа>|<интервал>){","(<константа>|<интервал>)}":" "("<описание полей>{";"<описание полей>}")".

<описание полей>::=<имя>{","имя} ":" (<имя типа>|<конструкция типа>).

Таким образом, такая запись состоит из необязательной фиксированной части и вариантной части, начинающейся словом Case.

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

Тип переключателя – это любой ординальный тип, константы и интервалы в вариантах – из множества значений типа переключателя. Константы не должны повторяться, а интервалы не должны перекрываться.

Поле-переключатель – необязательное поле. Если оно объявлено, оно присутствует во всех вариантах записи, то есть, относится к фиксированной части. Это поле можно использовать для хранения признака варианта записи.

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

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

Пусть в некоторой реализации Паскаля тип Integer представляется двумя байтами, причем младший байт размещается по младшему адресу в памяти компьютера, а тип Char представляется одним байтом. Тогда, используя записи с вариантными полями можно сделать отдельный доступ к младшему и старшему байтам, объявив следующий тип:

Type ByteAccess=Record Case Integer of

0:(I:Integer) {Два байта как одно поле Integer}

1:(Lo,hi:Char); {отдельно младш. И старш. Байты}

End;

Такой раздельный доступ может понадобиться, например, при доступе к двухбайтному регистру порта внешнего устройства.

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

. . . . . . . .

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]