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

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

Чтение в record [D7, XP]


Страницы:   1 2

charoey_mag ©   (2008-12-16 14:38:00) 

Есть запись
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 - правильно

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


Anatoly Podgoretsky   (2008-12-17 12:14:00) [1]

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

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


Ega23   (2008-12-17 10:47:00) [2]

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


Palladin   (2008-12-17 10:21:00) [3]

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

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


Григорьев Антон   (2008-12-17 08:48:00) [4]


> 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)


Ega23   (2008-12-16 16:12:00) [5]


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


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


Anatoly Podgoretsky   (2008-12-16 16:07:00) [6]

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

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


Ega23   (2008-12-16 15:37:00) [7]


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


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


charoey_mag   (2008-12-16 15:31:00) [8]


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

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


Anatoly Podgoretsky   (2008-12-16 15:26:00) [9]

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

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


Anatoly Podgoretsky   (2008-12-16 15:25:00) [10]

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

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


Ega23   (2008-12-16 15:14:00) [11]


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


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


Ega23   (2008-12-16 15:12:00) [12]


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


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


Anatoly Podgoretsky   (2008-12-16 15:09:00) [13]

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

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


Сергей М.   (2008-12-16 15:08:00) [14]


> Ega23


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


Ega23   (2008-12-16 15:05:00) [15]


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


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

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


Сергей М.   (2008-12-16 15:05:00) [16]


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


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


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


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


charoey_mag   (2008-12-16 15:05:00) [17]


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

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


charoey_mag   (2008-12-16 15:00:00) [18]


> mrc = packed record

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


Anatoly Podgoretsky   (2008-12-16 14:56:00) [19]

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

SizeOf


Ega23   (2008-12-16 14:42:00) [20]

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

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


Страницы:   1 2

Наверх

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