Форум: "Основная";
Текущий архив: 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