Программирование в среде Турбо Паскаль (Поляков, Круглов) - страница 92

| TYPE

| CharArrayType = Array [1..4] of Char;

| VAR

| V4 : RECORD

| case Boolean of

| True : ( С : CharArrayType );

| False : ( B1, B2, B3, B4 : Byte );

| END;

Размер переменной V4 — четыре байта (оба варианта равны). Обращение к V4.C — это обращение к массиву из четырех символов к V4.C[1] — к первому элементу этого массива. Но одновременно можно обратиться и к ASCII-кодам элементов V4.C[1], V4.C[2], .... V4.C[4], используя поля V4.B1, V4.B2 V4.B4.

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

WITH ИмяПеременной_Записи DO Оператор;

Внутри оператора (он может быть и составным) обращение к полям записи уже производится без указания идентификатора самой переменной:

| VAR

| DemoRec : RECORD X,Y : Integer END;

| ...

| WITH DemoRec DO

| BEGIN

| X:=0; Y:=120

| END; {with}

Внутри области действия оператора WITH могут указываться и

- 141 -

переменные, не имеющие отношения к записи. Но в этом случае надо следить, чтобы они не совпадали по написанию с полями записи (рис. 7.1).


| >PROGRAM MAIN;

| VAR

| >X, Y : Integer;

| >RecXY : RECORD X,Y: Integer END;

| BEGIN

| >X:=10; Y:=20; { значения переменных X и Y }

| >WITH RecXY DO BEGIN { работаем с записью RecXY }

| >X := 3.14*X; { Где какой X и Y ? }

| >Y := 3.14*Y

| >END; {with}

| >...

| END.


Рис. 7.1

На рис. 7.1 действия внутри оператора WITH проводятся только над полями записи RecXY. Чтобы сохранить оператор WITH и «развязать» имена X и Y, надо к переменным X и Y приписать так называемый квалификатор — имя программы или модуля (UNIT), в которой они объявлены (для этого программа должна иметь заголовок). Так, оператор присоединения с рис. 7.1 можно исправить следующим образом:

| WITH RecXY DO

| BEGIN

| X := 3.14*Main.X;

| Y := 3.14*Main.Y

| END;

и проблема исчезнет.

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

WITH ИмяЗаписи, Поле_3апись Do

BEGIN

Обращения к именам полей Поля_3аписи,

т.е. к тем, которым предшествовала конструкция

ИмяЗаписи.Поле_3апись.

END; {with}

- 142 -

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