Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2009.02.01;
Скачать: 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 вся ветка

Текущий архив: 2009.02.01;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.012 c
2-1229690059
ParaSenok
2008-12-19 15:34
2009.02.01
Запуск консольного приложения


15-1228746981
Putnik
2008-12-08 17:36
2009.02.01
Интернет-кафе


2-1229435530
nonamez11
2008-12-16 16:52
2009.02.01
поиск в строке


15-1228561459
oxffff
2008-12-06 14:04
2009.02.01
У меня родился сын! Спешу вам сообщить друзья


6-1197982424
user51
2007-12-18 15:53
2009.02.01
подключение к ADSL модему, нужно правильное отображение