Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.10.06;
Скачать: CL | DM;

Вниз

Где можно найти подробное описание типа 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;
Скачать: CL | DM;

Наверх




Память: 0.55 MB
Время: 0.023 c
14-18636
Soft
2003-09-17 01:55
2003.10.06
Программа выборочной рассылки электронной почты


1-18418
Chlavik
2003-09-25 14:48
2003.10.06
DrawFocuseRect. А Как нарисовать просто линию такого стиля?


1-18298
Kremen
2003-09-24 09:13
2003.10.06
Генерация клика мышкой по рабочему столу


1-18437
REA
2003-09-24 21:34
2003.10.06
Свойства компонентов


1-18471
!_Dmitry_!
2003-09-26 10:29
2003.10.06
Тех. задание