Замечание1:Порядок частей – именно такой, как показано: фиксированная часть всегда первая (или единственная)
Замечание2: Фиксированная часть может вообще отсутствовать.
Замечание3: Вариантная часть может быть только одна.
Фиксированная частьсостоит из отдельных полей и структура их точно такая же, как у ранее рассмотренных записей. Под каждую переменную, описываемую в фиксированной памяти, выделяется отдельная ячейка памяти.
Вариантная часть начинается со слова case.
Особенности вариантной части:
· Поле селектора может иметь следующие два вида:
1). имя : тип
2). тип
· Каждое вариантное поле предваряется константой, которая отделяется от описания поля двоеточием.
· Каждое описание вариантного поля заключается в круглые скобки.
· В вариантной части каждое поле описывается так же как и в фиксированном.
· По поводу типа селектора и типа константы. Тип селектора выбирается с таким расчетом, что бы число возможных изменений значений этого типа было не меньше, чем число этих вариантных полей.
· В ТР не принято использовать имя селектора вообще. Это в старом Паскале для того, чтобы выбрать нужный вариант, надо было присвоить соответствующее значение переменной-селектору.
· Тип селектора может быть любым порядковым кроме longint.
· Если известно, что число возможных значений не больше 2, то обычно используют boolean для типа селектора.
· По поводу того как вариантная запись располагается в памяти. Особенность этого состоит в том, что все вариантные поля разделяют одну и ту же область памяти. Размер этой области выбирается компилятором по размеру наибольшего вариантного поля. (по типу : 1 байт, 2 б, 4б и т.д.).
· В каждый конкретный момент времени вам доступно только одно поле из вариантной части.
· При переходе от одного вариантного поля к другому, значение вариантной части не меняется, меняется лишь та точка зрения на ту область памяти, которая отведена под вариантную часть.
Var
A : record
Case byte of
0 : (a1 : array [0..3] of byte);
1 : (a2 : array [0..1] of word);
2 : (a3 : longint);
3 : (a4 :string[3]);
end;
младший старший
байт байт
1-й вариант:
a1[0] | a1[1] | a1[2] | a1[3] |
2-й вариант:
a2[0] | a2[1] |
3-й вариант:
а3 |
Здесь изображены три точки зрения на одну память из 4 байтов:
1). Рассмотрим область как массив из 4-х элементов размером 1 байт.
2). Массив из 2-х элементов размером 2-а байта.
3). Одно значение размером в 4-е байта.
Наиболее частый случай использования таких вариантных записей состоит или в неявном преобразовании типов или в доступе к отдельным частям записи.
Примеры:
а.а1[0] : = 1; - в младший байт области памяти записывается значение 1.
а.а1[3] : = 1; - в старший байт области памяти записывается значение 1.
Если бы вместо longint записать string[3], то в этом случае можно было бы с каждым символом строки работать как с целым числом без всяких преобразований типов.
Дата добавления: 2016-05-28; просмотров: 1500;