![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Нужен хитрый вариантный тип [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]А что хотелось бы?