Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.007 c
1-18351
MakNik
2003-09-23 11:24
2003.10.06
Динамически заменять компоненты


3-18254
rava
2003-09-16 08:49
2003.10.06
Про Plan


1-18443
student
2003-09-24 21:49
2003.10.06
проблема в Tscrollbox-e


3-18245
Julie
2003-09-16 10:32
2003.10.06
SQL


7-18653
stkatch
2003-07-22 10:06
2003.10.06
MessageBox и другие визуальные компоненты Windows в сервисах





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский