Показать сообщение отдельно
  #8  
Старый 29.01.2008, 10:37
Аватар для Rokuell
Rokuell Rokuell вне форума
Активный
 
Регистрация: 27.12.2006
Адрес: Псков
Сообщения: 274
Версия Delphi: Delphi 7
Репутация: 497
Сообщение Условное описание

Насчёт памяти:
Внутри записи допустимо указывать несколько форм её представления, и описываются все эти формы "в стиле" оператора case (это только правило описания, способ нужного представления, понятный компилятору и разработчику, а не реальный машинный код).

Например программисту требуется использовать два типа данных: одну запись с полями:
Код:
Name : string[50];
Num: integer;
X:integer;
а другую - с полями:
Код:
a: integer;
b: char;
X:integer;
При этом программист точно знает, что он не будет применять эти группы полей одновременно друг с другом. Тогда вместо описания двух новых типов программист может описать один, только разделив внутреннюю структуру записи на две:
Код:
type TMyType = record
        X:integer;
        case boolean of
        true: (Name: string[50]; Num: integer);
        false: (a: integer; b: char);
        end;  
Подобная оригинальная запись расшифровывается следующим образом: Слово case говорит, что далее следует несколько форм представления типа (записи) TMyType. Сколько? Это определяется следующим за ключевым словом case типом Boolean ( в данном случае, т.к Boolean имеет всего два значения, мы можем указать всего две формы представления, написав другой тип, напр byte можно больше: 5, 10, хоть все 256 )
Далее в круглых скобках приводятся варианты внутренней структуры.
Закрывает описание case не собственное ключевое слово end, а слово end, завершающее описание всей записи
Обращатся к полям записи в тексте программы можно как обычно.
Данное описание используется ещё с первых версий программы для экономии памяти, т.к для всех представлений выделяется одна общая область памати (равная облатси памяти, требуемой для самого большого представления)

Конечно, одновременно обращатся к полям из разных описаний не следует: ведь создаются подобные раздельные описания как раз исходя из того, что совместно использоваться они не будут.

Но есть ещё один способ применения условного описания. Т.к в памати для представлений отводиться одна общяя область, то можно например орагизовать доступ к отдельным байтам переменной, напр. Integer имеет длину 4 байта, тогда:
Код:
type TMyType = record
        case byte of
        1: (I:integer);
        2: (bs: array [1..SizeOf(integer)] of byte);
        end;

var A:TMyType;
begin
A.I := '1568237'; // число типа integer
A.bs[1] // значения первого байта
A.bs[4] // значение последнего байта и т.п
...
__________________
Велик и могуч наш Object Pascal !
ICQ: 357-591-887
Ответить с цитированием