Главная страница
    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.13 c
1-1104322151
zokzok
2004-12-29 15:09
2005.01.16
Доступ к форме


3-1103106176
Pavelkq
2004-12-15 13:22
2005.01.16
Выбор типа базы.


9-1096094110
Goblin V
2004-09-25 10:35
2005.01.16
Смена видеорежима при переходе на другое приложение без закрытия


1-1104687802
NEEDHelp
2005-01-02 20:43
2005.01.16
Kak mozhno zapustit programu 4tob ona bila vidna okolo 4asov?


1-1104146426
zrv
2004-12-27 14:20
2005.01.16
Как сделать счетчик времени





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский