Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как учесть выравнивание в записи при переносе даных?


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; и :=


Наверх

Титульная страница Поиск, карта сайта Написать письмо