Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
BorlandPascal.doc
Скачиваний:
54
Добавлен:
17.03.2015
Размер:
2.83 Mб
Скачать

Записи и десигнаторы полей

Конкретное поле переменной-записи обозначается с помощью

ссылки на переменную-запись, после которой указывается обозначе-

ние поля, специфицирующее это поле.

---- --------------

обозначение поля --->¦ . ¦--->¦идентификатор¦--->

L---- ¦ поля ¦

L--------------

Приведем несколько примеров десигнаторов полей:

Today.Year

Results[1].Count

Result[1].When.Month

В операторе, входящем в оператор with, обозначению поля не

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

Десигнаторы компонентов объекта

Формат десигнатора компонента объекта совпадает с форматом

десигнатора поля записи. То есть, он состоит из экземпляра (ссыл-

ки на переменную), за которым следует точка и идентификатор ком-

понента. Десигнатор компонента, который обозначает метод, называ-

ется десигнатором метода. К экземпляру объектного типа можно

применить оператор with. В этом случае при ссылке на компоненты

объектного типа экземпляр и точку можно опустить.

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

При этом эффект будет тот же, что и при записи перед ссылкой на

компонент Self и точки.

Переменные-указатели и динамические переменные

Значением переменной-указателя является или nil (то есть

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

переменную.

Ссылка на динамическую переменную, на которую указывает пе-

ременная-указатель, записывается в виде переменной-указателя,

после которой ставится символ указателя (^).

Динамические переменные и значения их указателей создаются с

помощью стандартных процедур New и GetMem. Вы можете использовать

операцию @ и стандартную функцию Ptr для создания значений указа-

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

ных.

Значение nil не указывает ни на какую переменную. Если вы

попытаетесь получить доступ к динамической переменной при неопре-

деленном значении указателя или указателе, равном nil, результат

будет неопределенным.

Приведем несколько примеров ссылок (указателей) на динами-

ческие переменные:

P1^

P1.Sibling^

Results[1].Data^

Приведение типов переменных

Ссылка на переменную одного типа может быть преобразована в

ссылку на переменную другого типа с помощью приведения типов пе-

ременных.

-------------- ---- ----------- ----

приведение --->¦идентификатор+-->¦ ( +-->¦ссылка на +-->¦ ) +->

типов ¦ типа ¦ L---- ¦переменную¦ L----

L-------------- L-----------

Когда приведение типов применяется к ссылке на переменную,

ссылка на переменную рассматривается как экземпляр типа, предс-

тавленного идентификатором типа. Размер переменной (число байт,

занимаемых переменной) должен быть равен размеру типа, представ-

ленного идентификатором типа. После приведения типа переменной

можно указать один или несколько квалификаторов, если это допус-

кается указанным типом.

Примечание: Определять допустимость приведения типа

должен программист.

Приведем несколько примеров приведения типов переменных:

type

TByteRec = record

lo, hi: byte;

end;

TWordRec = record

low, high: word;

end;

TPtrRec = record

ofs, seg: word;

end;

PByte = ^Byte;

var

B: byte;

W: word;

L: longint;

P: pointer;

begin

W := $1234;

B := TByteRec(W).lo;

TByteRec(W).hi := 0;

L := $1234567;

W := TWordRec(L).lo;

B := PByte(L)^;

P := Ptr($40,$49);

W := TPtrRec(P).seg;

Inc(TPtrRec(P).Ofs,4);

end.

Обратите внимание на использование для доступа к младшим и

старшим байтам слова типа TByteRec: это соответствует встроенным

функциям Lo и Hi, только над левой частью в операции присваивание

может выполняться приведение типа. Отметим также, что для доступа

к младшим и старшим словам длинного целого, а также к смещению и

адресу сегмента указателя используются типы TWordRec и TPtrRec.

Borland Pascal также полностью поддерживает приведение типов

для процедурных типов. Например, имея следующие описания:

type

Func = function(X: Integer): Integer;

var

F: Func;

P: Pointer;

N: Integer;

вы можете построить следующие присваивания:

F := Func(P); { присвоить F значение процедурного типа в P }

Func(P) := F; { присвоить P значение процедурного типа в F }

@F := P; { присвоить F значение-указатель в P }

P := @F; { присвоить P значение-указатель в F }

N := F(N); { вызвать функцию через F }

N := Func(P)(N); { вызвать функцию через P }

Обратите в частности внимание на операцию получения адреса

@, которая применяется к переменной процедурного типа. Ее можно

использовать в левой части присваивания. Кроме того, отметьте

приведение типа на последней строке при вызове функцию через пе-

ременную-указатель.

Соседние файлы в предмете Программирование на Pascal