![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как учесть выравнивание в записи при переносе даных?
Erik1 © (2005-05-20 17:05:00)Собственно говоря мне надо переместить первых два поля записи в Integer.
RElement = record
State: TState;
TableID: TEnumTables;
ID, Parent_ID: TID;
TyypID: TID;
...
End;
Разумеется хочется седать красиво.
Var
Buf: Integer;
Begin
Move(Element, Buf, SizeOf(State)+SizeOf(TableID));
А при востановлении Move(Buf, Element, SizeOf(State)+SizeOf(TableID));
Но я чтото неуверен, небудет ошибок за счет выравнования?
Игорь Шевченко (2005-05-20 17:51:00) [1]Erik1 © (20.05.05 17:50) [6]
> А может быть при $Z1 перечисляемые типы будут еще идти без
> выравнивания?
Практика - критерий истины. Может быть. В случае packed record - совершенно точно без выравнивания.
Erik1 (2005-05-20 17:50:00) [2]to Игорь Шевченко
А может быть при $Z1 перечисляемые типы будут еще идти без выравнивания? И я вобще зря волнуюсь?
Игорь Шевченко (2005-05-20 17:45:00) [3]$Z + F1
Erik1 (2005-05-20 17:45:00) [4]Конечно SizeOf(Element.State) это лишнее.
Erik1 (2005-05-20 17:44:00) [5]TEnumTables = (enumTeenused, enumSeadmed, enumLeping);
TState = (stNone, stDelete, stInsert, stModify, stReInit, stError, stInit);
Так, что они прекрасно должны поместится в Integer и SizeOf(State) = SizeOf(TState) это верно для всех простых типов.
К сожалению packed record нехотелось использовать, поэтому и задал вопрос по возможности отслеживания выравнивания. Например можно перенести два поля по очереди
Var
Ptr: Pointer;
begin
Move(Element.State, Buf, SeofOf(Element.State))
Ptr := @Buf;
Inc(Integer(Ptr), SizeOf(Element.State));
Move(Element.TableID, Ptr^, SizeOf(Element.State)+SizeOf(Element.TableID));
Но это неверное не единственвый вариант?
Alexander Panov (2005-05-20 17:20:00) [6]Move(Element, Buf, SizeOf( TState)+SizeOf( TEnumTables));
При условии, что TState и TEnumTables - не динамические массивы +
[1] REA (20.05.05 17:16)
Вариант 1: packed record
REA (2005-05-20 17:16:00) [7]Вариант 1: packed record
Вариант 2:
TStateID = Record
State: TState;
TableID: TEnumTables;
End; и :=