Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Нужен хитрый вариантный тип [D3, D4, D5, D6, D7, WinXP]


LaidBack ©   (2004-12-24 08:57:00) 

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

 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;


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

LaidBack   (27.12.04 9:23) [7]

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

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


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


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


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


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


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


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

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


ЮЮ   (2004-12-27 08:36:00) [4]

глядя на 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;


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


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


Просто тип используется очень универсально и хочется в зависимости от задачи использовать нормально именованное поле.
Допустим, что в записи нужно сохранить одновременно указатель на поле и таблицу - используем поля 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 байт всегда висят вхолостую.


PVOzerski   (2004-12-24 11:51:00) [6]

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


icWasya   (2004-12-24 11:29:00) [7]

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

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


PVOzerski   (2004-12-24 11:23:00) [8]

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


Наверх

Титульная страница Поиск, карта сайта Написать письмо