Вниз
Скачать: CL | DM;

Чтение в record   Найти похожие ветки 

← →
charoey_mag   (2008-12-16 14:38) [0]

Есть запись
mrc = record
i:array[1..3] of char;
v:byte;
r:byte;
f:byte;
s:longword;
end;
Если делать так:

m:mrc;
Stream.Read(mrc,10);

то  все правильно, кроме
mrc.s = $761F; (это не правильно)
а если  так

Stream.Read(mrc.i,3);
Stream.Read(mrc.v,1);
Stream.Read(mrc.r,1);
Stream.Read(mrc.f,1);
Stream.Read(mrc.s,4); //$761F0000 - правильно

Объясните пожалуста что не так, почему происходит смещение?


← →
Сергей М. ©   (2008-12-16 14:39) [1]

mrc = packed record


← →
Ega23 ©   (2008-12-16 14:42) [2]

mrc = packed record
i:array[1..3] of char;
v:byte;
r:byte;
f:byte;
s:longword;
end;
Если делать так:

m:mrc;
Stream.Read(m, SizeOb(mrc));


← →
Anatoly Podgoretsky ©   (2008-12-16 14:56) [3]

> charoey_mag  (16.12.2008 14:38:00)  [0]

SizeOf


← →
charoey_mag   (2008-12-16 15:00) [4]


> mrc = packed record

Спасибо работает.
А SizeOf не использую, потому что не всегда понятно что он вернет, толи размер значения, толи размер ссылки на объект(в одно время помучался, почему читает 4 байта вместо того сколько надо)


← →
charoey_mag   (2008-12-16 15:05) [5]


> Anatoly Podgoretsky ©   (16.12.08 14:56) [3]
> SizeOf

если убрать packed и поставить SizeOf то опять не верное значение


← →
Сергей М. ©   (2008-12-16 15:05) [6]


> помучался, почему читает 4 байта вместо того сколько надо


Потому что надо четко понимать, где данные. а где указатель на данные.


> не всегда понятно что он вернет


В дан.случае он вернет именно то что нужно.
Завтра ты раздухаришься и начнешь менять свою структуру, соотв-но размер ее тоже будет меняться.
Вот и представь себе, что тебя ждет, если ты перед этим размазал по всему коду своего проекта кучу строчек вида Stream.Read(mrc,10);


← →
Ega23 ©   (2008-12-16 15:05) [7]


> А SizeOf не использую, потому что не всегда понятно что
> он вернет, толи размер значения, толи размер ссылки на объект(в
> одно время помучался, почему читает 4 байта вместо того
> сколько надо)


Он вернёт ровно столько, сколько положено. Если это Char - то 1. Если Pointer - 4. Если TMySuper_Puper_Mega_Record - то размер этого TMySuper_Puper_Mega_Record.

А вот если тебе завтра приспичит добавить в этот рекорд ещё что-нибудь, а что-нибудь убрать - ох и натрахаешься ты везде по коду 10 на новое значение менять.


← →
Сергей М. ©   (2008-12-16 15:08) [8]


> Ega23


Сегодня он имеет структуру, а завтра структура будет иметь его)


← →
Anatoly Podgoretsky ©   (2008-12-16 15:09) [9]

> charoey_mag  (16.12.2008 15:05:05)  [5]

И с packed и без всегда вернет правильное значение.


← →
Ega23 ©   (2008-12-16 15:12) [10]


> Сегодня он имеет структуру, а завтра структура будет иметь
> его)


Самое прикольное будет, когда размер Integer изменится (не дай Бог).


← →
Ega23 ©   (2008-12-16 15:14) [11]


> И с packed и без всегда вернет правильное значение.


Я накалывался, когда в стрим читал/писал. Размер-то правильный. А вот буфер читало неправильно, с выравниванием.


← →
Anatoly Podgoretsky ©   (2008-12-16 15:25) [12]

> Ega23  (16.12.2008 15:12:10)  [10]

Первый раз что ли.


← →
Anatoly Podgoretsky ©   (2008-12-16 15:26) [13]

> Ega23  (16.12.2008 15:14:11)  [11]

Как ты умудрился?


← →
charoey_mag   (2008-12-16 15:31) [14]


> Самое прикольное будет, когда размер Integer изменится (не
> дай Бог).

В 64бит ОС я так мыслю integer уже изменился


← →
Ega23 ©   (2008-12-16 15:37) [15]


> Как ты умудрился?


Да я уже и не помню как. Помню только, что packed проблему моментом решило.


← →
Anatoly Podgoretsky ©   (2008-12-16 16:07) [16]

> Ega23  (16.12.2008 15:37:15)  [15]

Мальчиш-Кибальчиш не хочешь выдавать главную программисткую тайну.


← →
Ega23 ©   (2008-12-16 16:12) [17]


> Мальчиш-Кибальчиш не хочешь выдавать главную программисткую
> тайну.


Да я правда не помню. Года 4 назад дело было. Ещё под D5.


← →
Григорьев Антон ©   (2008-12-17 08:48) [18]


> charoey_mag   (16.12.08 15:31) [14]
> В 64бит ОС я так мыслю integer уже изменился

Марко Кэнту пишет, что Integer пока решено оставить 32-разрядным во всех системах, а вместо этого будет NativeInt и NativeUInt, которые будут 32- или 64-разрядными в зависимости от разрядности платформы.

Информация отсюда: http://dn.codegear.com/article/images/39076/New_Delphi_Coding_Styles_and_Architectures.pdf (см. страницу 23)


← →
Palladin ©   (2008-12-17 10:21) [19]

негодяи... сейчас всех запутают нафих... всю сознательную жизь писал с учетом, что разрядность integer увеличится синхронно с pointer... а они вот чего творят... и что в результате? а в результате глобальный рефакторинг по поводу pointer<>integer

или и pointer оставят 32-разрядным, а вместо этого будет NativePointer ? :)
нее... что творят, что творят...


← →
Ega23 ©   (2008-12-17 10:47) [20]

сцуки. Раньше по-другому пели...


← →
Anatoly Podgoretsky ©   (2008-12-17 12:14) [21]

> Palladin  (17.12.2008 10:21:19)  [19]

Творят, что хотят.



Страницы: 1 вся ветка

Скачать: CL | DM;



Память: 0.49 MB
Время: 0.007 c
15-1228576006
Artem
2008-12-06 18:06
2009.02.01
Литература COM в Delphi


2-1229319612
CodeMaster
2008-12-15 08:40
2009.02.01
Прокрутка в Наследнике класса TListBox


15-1228660225
Клаус
2008-12-07 17:30
2009.02.01
Объединение таблиц.


3-1213899571
SuperChel
2008-06-19 22:19
2009.02.01
Запрос на SQL для выборки иерархического списка


2-1229789252
self
2008-12-20 19:07
2009.02.01
ticqclient в dll




   Наверх