Главная страница
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.034 c
3-1103010445
Zilog
2004-12-14 10:47
2005.01.16
БД + потоки


14-1103799935
Ega23
2004-12-23 14:05
2005.01.16
Вопрос по C++. Скорее даже по среде VS


1-1103920100
asd123123
2004-12-24 23:28
2005.01.16
Мне надо сохранять информацию


1-1104689976
Delpher_Gray
2005-01-02 21:19
2005.01.16
Дополнительные переменные в private. FMyVar...


11-1084974886
Terminus
2004-05-19 17:54
2005.01.16
KOLTabControl это еще не PageControl :). Есть вопрос...