Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2005.01.16;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.46 MB
Время: 0.036 c
6-1097776696
Viper
2004-10-14 21:58
2005.01.16
Обучение работы с сетью


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


9-1096272516
Werwolf
2004-09-27 12:08
2005.01.16
Вопрос ко всем игроделам


14-1103887030
pasha_golub
2004-12-24 14:17
2005.01.16
Manual ZeosDBO


1-1104147339
Tack
2004-12-27 14:35
2005.01.16
Главное меню под XP - очень страшное





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский