КАТЕГОРИИ: Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748) |
Указатели и динамические структуры данных
........ ........ Begin ........ ........ Записи с вариантными полями В некоторых случаях в программе нужно представить сходные, но неодинаковые объекты. Часть атрибутов у них одинакова, часть отличается. Конечно, можно для них определить различные типы записей, но это не всегда удобно, поскольку сходство объектов подразумевает однотипность некоторых операций над ними, по крайней мере, в отношении одинаковых атрибутов. Представление таких объектов разными типами записей может потребовать дублирования однотипных операций для разных типов записей и отдельного выполнения этих операций для каждого из наборов записей. В таких случаях удобнее использовать записи одного типа, часть полей которых будет одинакова для всех объектов, а другая часть будет разной для отличающихся атрибутов объектов. Для этого в Паскаль введено понятие записей с вариантными полями: <конструкция записи с вариантными полями>::="Record" [<фиксированная часть>"];"<вариантная часть> "End". <фиксированная часть>::=<описание полей>{";"<описание полей>}. <вариантная часть>::="Case" [<поле-переключатель>":"] <имя типа переключателя> "of" <вариант> {";"<вариант>}. <вариант>::= (<константа>|<интервал>){","(<константа>|<интервал>)}":" "("<описание полей>{";"<описание полей>}")". <описание полей>::=<имя>{","имя} ":" (<имя типа>|<конструкция типа>). Таким образом, такая запись состоит из необязательной фиксированной части и вариантной части, начинающейся словом Case. Все имена полей должны быть уникальными в пределах записи. Тип переключателя – это любой ординальный тип, константы и интервалы в вариантах – из множества значений типа переключателя. Константы не должны повторяться, а интервалы не должны перекрываться. Поле-переключатель – необязательное поле. Если оно объявлено, оно присутствует во всех вариантах записи, то есть, относится к фиксированной части. Это поле можно использовать для хранения признака варианта записи. Паскаль никаким образом не контролирует использование вариантных частей таких записей. Программист по своему усмотрению определяет, по какому из возможных вариантов обрабатывать вариантную часть. Например, можно хранить нужный признак в поле-переключателе и, в зависимости от значения этого поля, выбирать тот или иной алгоритм обработки. Либо можно определить другую процедуру выбора. Последнее обстоятельство открывает возможность использования записей с вариантными полями для различных трюков. Рассмотрим один из них. Пусть в некоторой реализации Паскаля тип Integer представляется двумя байтами, причем младший байт размещается по младшему адресу в памяти компьютера, а тип Char представляется одним байтом. Тогда, используя записи с вариантными полями можно сделать отдельный доступ к младшему и старшему байтам, объявив следующий тип: Type ByteAccess=Record Case Integer of 0:(I:Integer) {Два байта как одно поле Integer} 1:(Lo,HI:Char); {отдельно младш. и старш. байты} End; Такой раздельный доступ может понадобиться, например, при доступе к двухбайтному регистру порта внешнего устройства. Следующий пример показывает, как можно поменять местами младший и старший байты, используя описанный выше тип. Var E: Integer; {В этой переменной будем менять байты} C: Char; {это вспомогательная переменная} H: ByteAccess; {это трюковая переменная} E:=2; {Двоичн. знач. 0000 0000 0000 0010} Writeln(E); {Будет выведено число 2} With H do Begin {работаем с трюковой переменной} I:=E;{заносим исходное значение в трюковую переменную} C:=Lo;{заносим младший байт во вспомогат. переменную} Lo:=Hi; {пишем старший байт в младший байт} Hi:=C; {пишем младший байт в старший байт} E:=I {возвращаем результат в исходную переменную} End; {Теперь в E двоичн. знач. 0000 0010 0000 0000} Writeln(E); {Будет выведено число 512}
Дата добавления: 2014-01-11; Просмотров: 314; Нарушение авторских прав?; Мы поможем в написании вашей работы! Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет |