Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.01.16;
Скачать: CL | DM;

Вниз

Нужен хитрый вариантный тип   Найти похожие ветки 

 
LaidBack   (2004-12-24 08:57) [0]

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

 pAbiToken = ^TAbiToken;
 TAbiToken = packed record
   case Byte of
   0: (case Byte of
       0: ( LexerObj  : Pointer );
       1: ( FieldObj  : Pointer );
      );
   1: (case Byte of
       0: ( ParserObj  : Pointer );
       1: ( CursorObj : Pointer );
      );
 end;

Очень не хотелось бы делать тип

TAbiToken2 = packed record
 Part1: TAbiToken;
 Part2: TAbiToken;
end;


 
PVOzerski ©   (2004-12-24 11:23) [1]

А что хотелось бы?


 
icWasya ©   (2004-12-24 11:29) [2]

ну а так почему нельзя

pAbiToken = ^TAbiToken;
TAbiToken = packed record
  case Byte of
   0: ( LexerObj  : Pointer ; ParserObj  : Pointer );
   1: ( FieldObj  : Pointer ; CursorObj : Pointer );
end;
и написать длинный комантарий


 
PVOzerski ©   (2004-12-24 11:51) [3]

Вообще, если посмотреть на код, видно, что все поля-то одного типа. Из чего следует пара вопросов: 1) а зачем тогда по сути делать разные имена для одних и тех же полей; 2) а не будет ли вообще удобнее массив вместо записи?


 
deleon   (2004-12-27 08:10) [4]


> Вообще, если посмотреть на код, видно, что все поля-то одного
> типа.


Просто тип используется очень универсально и хочется в зависимости от задачи использовать нормально именованное поле.
Допустим, что в записи нужно сохранить одновременно указатель на поле и таблицу - используем поля CursorObj и FieldObj, а если лексер и парсер - используем поля LexerObj и ParserObj. Т.е. хочется иметь пару полей поинтеров, но обращаться к ним через удобные наименования. Если бы pascal позволял, то моя идея выглядела бы так:

pAbiToken = ^TAbiToken;
TAbiToken = packed record
  case Byte of
  0: ( LexerObj  : Pointer );
  1: ( FieldObj  : Pointer );
  end;
  case Byte of
  0: ( ParserObj  : Pointer );
  1: ( CursorObj : Pointer );
  end;
end;

Но к сожалению так нельзя и сейчас я выкручиваюсь подобной записью:

pAbiToken = ^TAbiToken;
TAbiToken = packed record
  LexerObj  : Pointer;
  FieldObj  : Pointer;
  ParserObj : Pointer;
  CursorObj : Pointer;
end;

Из них одновременно нужны только 2, поэтому 8 байт всегда висят вхолостую.


 
ЮЮ ©   (2004-12-27 08:36) [5]

глядя на pAbiToken = ^TAbiToken; можно проедноложить, что память для record-ов выделяется динамически и, фактически, у нас имеется только указатель.
 Почему бы его и не приводить к нужному типу, например,
PAbiLexerToken(<указатель>).LexerObj
PAbiFieldLexerToken(<указатель>).FieldObj  
, где

TAbiLexerToken = packed record
 LexerObj  : Pointer ;
 ParserObj  : Pointer;  
end;
PAbiLexerToken = ^TAbiLexerToken;

TAbiFieldLexerToken = packed record
 FieldObj  : Pointer ;
 CursorObj : Pointer;
end;
PAbiFieldLexerToken := ^TAbiFieldLexerToken;


 
КаПиБаРа ©   (2004-12-27 08:39) [6]

TAbiToken = packed record
 case Byte of
 0: ( Lexer_Parser  : Pointer );
 1: ( Field_Cursor  : Pointer );
 end;
end;


 
LaidBack   (2004-12-27 09:23) [7]


> PAbiLexerToken(<указатель>).LexerObj
> PAbiFieldLexerToken(<указатель>).FieldObj  


Классная идея, спасибо!


> TAbiToken = packed record
>  case Byte of
>  0: ( Lexer_Parser  : Pointer );
>  1: ( Field_Cursor  : Pointer );
>  end;
> end;


Не катит, т.к. размер этой записи будет равен размеру поинтера и хранить два объекта одновременно в ней не получится :(


 
КаПиБаРа ©   (2004-12-27 09:42) [8]

LaidBack   (27.12.04 9:23) [7]

Чет я ошибся...

TAbiToken = packed record
 Lexer_Parser  : Pointer;
 Field_Cursor  : Pointer;
end;



Страницы: 1 вся ветка

Текущий архив: 2005.01.16;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.061 c
1-1104316034
infom
2004-12-29 13:27
2005.01.16
Никак не получается чтобы RichEdit


14-1104155033
blackman
2004-12-27 16:43
2005.01.16
Оскорбляет ли Вас празднование в Москве юбилея императора Наполео


14-1103810851
inic
2004-12-23 17:07
2005.01.16
Брутальный картридж :))


10-1080297097
IgorYak
2004-03-26 13:31
2005.01.16
TClientDataSet.ApplyUpdates (CORBA - Delphi 6, Kylix)


3-1102756670
OlegL
2004-12-11 12:17
2005.01.16
dbf