В завершение отметим одну особенность компилятора Турбо Паскаля. Для многих языков программирования справедливо правило: работа с элементом массива занимает больше времени, чем со скалярной переменной (надо вычислять местоположение элемента в памяти). Если индексы при обращении к элементу задаются переменными или выражениями, то это верно и для Турбо Паскаля. Но если индекс элемента задается константой, то скорость обращения к нему будет максимальной, потому что компилятор в этом случае вычислит расположение элемента еще на этапе компиляции программы.

<p>7.2. Тип «запись» (Record) и оператор присоединения With</p>

Для компактного представления комбинаций разнотипных данных их можно объединять в структуры-записи. Каждая запись состоит из объявленного числа полей. Тип «запись» определяется конструкцией

RECORD

Поле1 : ТипПоля1;

Поле2 : ТипПоля2;

...

ПолеN : ТипПоляN

END;

Если тип нескольких полей совпадает, то имена полей могут быть просто перечислены, например:

| TYPE

| PointRecType = RECORD

| x,y : Integer

| END;

После объявления в программе переменной типа «запись»

| VAR

| Point : PointRecType;

к каждому ее полю можно обратиться, указав сначала идентификатор переменной-записи, а затем через точку — имя поля: Point.x и Point.y — значения полей записи (но просто Point — уже комбинация двух значений).

- 137 -

Независимо от количества объявленных переменных данного типа, поля каждой из них будут называться одинаково, как они названы в описании типа. Поскольку имена полей «скрыты» внутри типа, они могут дублировать «внешние» переменные и поля в других описаниях записей, например:

| TYPE

| PointRecType = RECORD

| X,Y : Integer

| END;

| ColorPointRecType = RECORD

| X,Y : Integer; Color:Word

| END;

| VAR

| X, Y : Integer;

| Point : PointRecType;

| ColorPoint : ColorPointRecType;

В программе X, PointX и ColorPoint.X — совершенно разные значения. Поле записи может иметь практически любой тип (массив, другая запись, множество). Доступ к вложенным элементам таких структур осуществляется по тем же правилам, что и обычно:

Переменная_СложнаяЗапись.ЕеПоле_Запись.ПолеПоляЗаписи

или

Переменная_С_полем_массивом.ПолеМассив[i]

Порядок описания полей в определении записи задает их порядок хранения в памяти. Так, значения полей переменной ColorPoint хранятся как шесть последовательных байтов:

2 ( это X, тип Integer) + 2 ( Y, тип Integer) + 2 (для Color типа Word).

Запись может иметь вариантную часть. Это означает, что можно задать в пределах одного типа несколько различных структур. Непосредственный выбор структуры будет определяться контекстом или каким-либо сигнальным значением. Вариантные поля указываются после того, как перечислены поля фиксированные. Вариантные поля и оформляются особым образом. Рассмотрим пример описания типа VRecType — записи с вариантами.

| TYPE

| VRecType = RECORD { тип записи с вариантами }

| Number : Byte; { номер измерения длины }

| case Measure : Char of { признак единицы длины }

| 'д','Д' (inches : Word); {длина в дюймах}

| 'с','С' (cantimeters : LongInt); { длина в см }

| '?' (Comment1, Comment2 : String[16]) { тексты }

| END;

- 138 -

В данном случае в записи имеется обычное фиксированное поле Number. Другое фиксированное поле — Measure. Оно всегда присутствует в структуре записи, но параллельно с этим выполняет роль селектора (иногда его называют полем тега от английского «Tag Field»). Поле-селектор обрамляется словами CASE и OF, и за ним следует перечисление вариантов третьего поля, взятых в круглые скобки. Какой именно вариант поля будет принят при работе с записью, обозначается содержимым селектора (Measure в приведенном примере). Значения селектора, указывающие на тот или иной вариант, записываются перед соответствующими вариантами (аналогично тому, как это происходит в операторе выбора CASE). Пусть объявлена переменная VRec типа VRecType. В зависимости от содержимого поля-селектора Measure будут корректно работать поля записи, показанные в табл. 7.1.

Таблица 7.1

Measure =

'д' или 'Д'

'с' или 'С'

'?'

прочие

Поля Vrec, к которым обращение будет корректным.

Number

Measure

inches

Number

Measure

cantimeters

Number

Measure

Comment1

Comment2

Number

Measure

Важно понимать, что в любое время доступны поля только одного из всех возможных вариантов, описанных в типе (или ни одно из них). Все варианты располагаются в одном и том же месте памяти при хранении, а размер этого места определяется самым объемным из вариантов. Так, запись типа VRecType будет храниться как 36 байт (1 байт — Number, 1 байт — Measure и 2*(16+1) байт на самый длинный вариант — с типом поля String[16]) независимо от выбора варианта.

Следствием такого способа хранения вариантов является опасность наложения значений при неправильных действиях с записями:

| VAR

| VRec : VRecType;

| BEGIN

Перейти на страницу:

Поиск

Похожие книги