Форум: "Основная";
Текущий архив: 2003.10.06;
Скачать: [xml.tar.bz2];
ВнизГде можно найти подробное описание типа packed record ? Найти похожие ветки
← →
GreySerg (2003-09-22 13:22) [0]Где можно найти подробное описание типа packed record ?
С примерами использования и с подробным объяснением расположения в памяти.
← →
Skier (2003-09-22 13:25) [1]В справке есть.
← →
GreySerg (2003-09-22 13:30) [2]там очень кратко
← →
Skier (2003-09-22 13:30) [3]Тогда вопросы задавай, что не ясно...
← →
Юрий Федоров (2003-09-22 13:32) [4]Тот же record, только без выравнивания.
То есть заканчивается одно поле и сразу начинается другое (по распределению в памяти)
← →
GreySerg (2003-09-22 13:36) [5]есть такой тип в Делфи
TGUID = packed record
D1: Longword;
D2: Word;
D3: Word;
D4: array[0..7] of Byte;
end;
Как будет физически расположена в памяти такая константа
const IID_IMalloc: TGUID = "{00000002-0000-0000-C000-000000000046}" ?
← →
Skier (2003-09-22 13:38) [6]В сегменте данных. 16 байт.
← →
GreySerg (2003-09-22 13:39) [7]и почему представление TGUID - 32 символа ) , хотя по структуре видно что он занимает 16 байтов ?
← →
GreySerg (2003-09-22 13:41) [8]и что будет хранится в D1, D2, D3 и D4 для константы IID_IMalloc ?
← →
Skier (2003-09-22 13:43) [9]
> и почему представление TGUID - 32 символа )
Это строковое представление
Например 255 - три символа, но на самом деле чтобы их "уместить" хватит одного байта.
← →
Palladin (2003-09-22 13:43) [10]а ты думаешь каждый символ это байт в структуре?
← →
Digitman (2003-09-22 14:08) [11]Смещение_поля Размер_поля Значение
IID_IMalloc.D1 (+0) (4) = $00000002
IID_IMalloc.D2 (+4) (2) = $0000
IID_IMalloc.D3 (+6) (2) = $0000
IID_IMalloc.D4: (+8)(8) = $46 $00 $00 $00 $00 $00 $00 $C0
← →
GreySerg (2003-09-22 14:16) [12]тогда чем отличается
TGUID = packed record
D1: Longword;
D2: Word;
D3: Word;
D4: array[0..7] of Byte;
end;
от
TGUID = record
D1: Longword;
D2: Word;
D3: Word;
D4: array[0..7] of Byte;
end;
← →
mike.dld (2003-09-22 14:18) [13]по-моему, в этом конкретном случае ничем, так как выравнивание делается по словам
← →
mike.dld (2003-09-22 14:19) [14]или по параграфам?
← →
Verg (2003-09-22 14:22) [15]
> по-моему, в этом конкретном случае ничем, так как выравнивание
> делается по словам
word - это 16-ти битное слово, а выравнивание если уж и идет, то по 32-х битному (или как установлено в опциях компиллера).
Вот для того, чтобы не зависеть от настроек компилера и пишут packed - устанавливая выравнивание в данной структуре = 1 байт.
← →
mike.dld (2003-09-22 14:24) [16]вобщем, без packed появится лишний DWORD
← →
GreySerg (2003-09-22 14:25) [17]что есть выравнивание и с чем его едят ?
пример пожалуйста
← →
GreySerg (2003-09-22 14:28) [18]>mike.dld ©
то есть без packed получится не 16 байт , а 20 ?
← →
Skier (2003-09-22 14:29) [19]
> что есть выравнивание и с чем его едят ?
Выравнивание используется для более быстрого доступа к полям.
← →
mike.dld (2003-09-22 14:30) [20]> GreySerg (22.09.03 14:28) [18]
да
← →
Verg (2003-09-22 14:32) [21]Для ускорения работы кода с данными, компиллер размещает поля структур не прямо одно за другим, руководствуясь его размером, а обеспечивая кратность адресов полей = 4 (или 8 или еще сколько там написано в опции Record Field Aligment).
← →
GreySerg (2003-09-22 14:33) [22]т.е. если бы не было packed , то моя константа выглядела в памяти так:
ID_IMalloc.D1 (+0) (4) = $00000002
IID_IMalloc.D2 (+4) (2) = $0000
IID_IMalloc.D3 (+6) (2) = $0000
IID_IMalloc.D4: (+8)(12) = $46 $00 $00 $00 $00 $00 $00 $00 $00 $00 $00 $C0
так ?
← →
Verg (2003-09-22 14:35) [23]Так вот, если у recorda поставить packed, то ты указываешь дельфе, что бы она этой "фигней" с выравниванием не страдала, а размещала поля этой записи просто одно за другим, типа наплевать на скорость, главное - совместимость.
← →
mike.dld (2003-09-22 14:35) [24]ID_IMalloc.D1 (+0) (4) = $00000002
IID_IMalloc.D2 (+4) (4) = $00000000
IID_IMalloc.D3 (+8) (4) = $00000000
IID_IMalloc.D4: (+12)(8) = $46 $00 $00 $00 $00 $00 $00 $C0
← →
GreySerg (2003-09-22 14:39) [25]>Verg
т.е. если Record Field Aligment = 8
то без packed константа ID_IMalloc будет выглядеть так:
D_IMalloc.D1 (+0) (8) = $00 $00 $00 $00 $00 $00 $00 $02
IID_IMalloc.D2 (+8) (8) = $00 $00 $00 $00 $00 $00 $00 $00
IID_IMalloc.D3 (+16) (8) = $00 $00 $00 $00 $00 $00 $00 $00
IID_IMalloc.D4: (+24)(8) = $46 $00 $00 $00 $00 $00 $00 $C0
← →
GreySerg (2003-09-22 14:43) [26]> mike.dld ©
это если Record Field Aligment = 4 ?
← →
mike.dld (2003-09-22 14:45) [27]да
← →
Verg (2003-09-22 14:46) [28]
> const IID_IMalloc: TGUID = "{00000002-0000-0000-C000-000000000046}"
По-моему такие конструкции допустимы ТОЛЬКО с TGUID. Т.е. тип TGUID - это специабельный такой тип. Т.е. константы этого типа можно определять как строковые, но и то, только в определенном формате.
В то же время к этим переменным можно обращаться как к записям с полями.
Формально этот тип определен как ты уже знаешь, т.е. без packed в данном случае вообще разговор некорректен.
← →
GreySerg (2003-09-22 14:57) [29]ок, разобрался
а теперь предложите пожалуйста, как хранить GUID в базе , чтобы размер поля был наименьшим , т.е. наименьший размер char(16), но при этом возникает такая штука : как доставать такое поле из базы , если один из символов = 0 , ведь FieldByName("Field1").Value вытащит строку до 0-го терминального символа (если он встретится), а не все 16 символов
← →
GreySerg (2003-09-22 14:59) [30]и при записи поля тоже возникнет такая штука
← →
Verg (2003-09-22 15:05) [31]Опаньки, у нука, наберите TFieldType + F1
Смотрите, среди прочего есть ftGuid
← →
GreySerg (2003-09-22 15:21) [32]> Verg
если мы делаем FieldByName("Field1").AsGuid := MyGuid;
где - Field1 - поле типа char(16),
то в поле сохранится значение "{00000002-0000-0" вместо "{00000002-0000-0000-C000-000000000046}"
← →
Digitman (2003-09-22 15:36) [33]
> GreySerg
см. TField.GetData/SetData
это методы, позволяющие работать с содержимым поля ЛЮБОГО типа в raw ("грязном") - формате.
← →
GreySerg (2003-09-22 16:03) [34]а если передавать такой параметр в ADOQuery , то у TParameter нет таких методов
← →
Digitman (2003-09-22 16:25) [35]зато TParameter имеет св-во DataType = ftGuid
тогда вот это
MyADOQueryParameter.Value := IID_IMalloc;
не вызовет исключения
← →
GreySerg (2003-09-22 16:38) [36]исключение то не вызовет , но сохранит в поле char(16)в урезанном виде
← →
Digitman (2003-09-22 16:48) [37]с чего бы вдруг ?
про "урезанный вид" ты упоминал для случая
FieldByName("Field1").AsGuid := MyGuid;
← →
GreySerg (2003-09-22 17:37) [38]ну значит не найдёт запись с полем char(16 ) , равным такому параметру
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2003.10.06;
Скачать: [xml.tar.bz2];
Память: 0.52 MB
Время: 0.009 c