Текущий архив: 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