Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2010.03.28;
Скачать: [xml.tar.bz2];

Вниз

Dword в Record   Найти похожие ветки 

 
novichek   (2010-01-21 00:59) [0]

TmyRec = record
      b : byte;
      w: word;
      d: Dword;
...
    end;

после записи в файл заметил что после Dword почему-то добавляется байт равный 00.

не подкажите почему?


 
Игорь Шевченко ©   (2010-01-21 01:10) [1]

packed record


 
novichek   (2010-01-21 01:15) [2]

че-то в замешательстве..

даже не байт в конце а и в начале то же..
идет b, w, 00, d, 00, ..
присвоил w=5, стало после w не 00 а 18..

если не лезьт в дебри, обратный процесс чтения с файла будет нормальным?
а если лезть, в двух слова можно про packed record ?


 
Чайник ©   (2010-01-21 01:25) [3]

Обычный  record выравнивается компилятором до word или double-word (кратным 4-м или 8 байтам) добавлением нулей. При packed - соответственно не выравнивается. Borland предупреждает, что доступ к не выравненным (packed) структурам работает медленнее, чем к выравнененным.


 
novichek   (2010-01-21 01:31) [4]

спасибо, вообщем в далеке понятно..
тогда нужно отходить от этого в использовании записи в файл, а то потом запутаться запросто можно..


 
Германн ©   (2010-01-21 01:45) [5]


> Чайник ©   (21.01.10 01:25) [3]
>
> Обычный  record выравнивается компилятором до word или double-
> word (кратным 4-м или 8 байтам)

"Обычный" record выравнивается компилятором тучей разных способов.
Зависит от версии Дельфи.


 
Германн ©   (2010-01-21 01:48) [6]


> novichek   (21.01.10 01:31) [4]
>
> спасибо, вообщем в далеке понятно..
> тогда нужно отходить от этого в использовании записи в файл,
>  а то потом запутаться запросто можно..
>

Прочти справку и пойми её. Потом поймешь, что ответ Игорь Шевченко ©   (21.01.10 01:10) [1] полностью снимает все проблемы записи/чтения твоего файла.


 
Плохиш ©   (2010-01-21 15:36) [7]


> а если лезть, в двух слова можно про packed record ?
>

Пожалуйста

Wenn ein Record-Typ mit dem voreingestellten Status {$A+} deklariert wird und die Deklaration nicht den Modifizierer packed enthält, handelt es sich um einen ungepackten Record-Typ. Die Felder des Records werden so ausgerichtet, dass die CPU möglichst effizient darauf zugreifen kann. Die Ausrichtung hängt von den Typen der einzelnen Felder ab und davon, ob Felder zusammen deklariert werden. Jeder Datentyp besitzt eine implizite Ausrichtungsmaske, die vom Compiler automatisch berechnet wird. Sie kann die Werte 1, 2, 4 oder 8 haben und entspricht dem Byte-Raster, in dem ein Wert dieses Typs für den optimalen Zugriff im Speicher angeordnet werden muss. Die folgende Tabelle enthält die Ausrichtungsmasken für alle Datentypen.

и

Wenn die beiden Felder eine gemeinsame Typspezifikation teilen, werden diese selbst dann gepackt, wenn die Deklaration nicht den Modifizierer packed enthält und der Record-Typ nicht mit dem {$A-}-Status deklariert ist. Betrachten Sie folgende Deklaration:

type
 TMyRecord = record
   A, B: Extended;
   C: Extended;
 end;

A und B werden gepackt (an Byte-Grenzen ausgerichtet), da sie dieselben Typspezifikation verwenden. Der Compiler füllt die Struktur mit unbenutzten Bytes aus, um sicherzustellen, dass C auf einer Quadword-Grenze erscheint.

Wenn ein Record-Typ mit dem Status {$A–} deklariert wird oder die Deklaration den Modifizierer packed enthält, werden die Felder des Records nicht ausgerichtet, sondern einfach an aufeinander folgenden Offsets abgelegt. Die Gesamtgröße eines solchen gepackten Records ergibt sich aus der Größe aller Felder. Da sich die Datenausrichtung ändern kann, bieten sich gepackte Record-Typen für alle Record-Strukturen an, die auf Festplatte geschrieben oder im Speicher an ein Modul übergeben werden sollen, das mit einer anderen Version des Compilers compiliert wird.


 
Игорь Шевченко ©   (2010-01-21 15:54) [8]

Плохиш ©   (21.01.10 15:36) [7]

Наконец-то! :)


 
Anatoly Podgoretsky ©   (2010-01-21 15:56) [9]


> Игорь Шевченко ©   (21.01.10 15:54) [8]

На него вся надежда была, кто еще выписку из справки предоставит?


 
Неважно   (2010-01-21 16:04) [10]

2 Плохиш ©   (21.01.10 15:36) [7]

А на каком это ? Немецкий что-ли ?


 
Плохиш ©   (2010-01-21 16:13) [11]


> Игорь Шевченко ©   (21.01.10 15:54) [8]

Да, я понял, что без справки им никуда :-)

> Anatoly Podgoretsky ©   (21.01.10 15:56) [9]

Вы все злые, один я белый и пушистый :-))

> Неважно   (21.01.10 16:04) [10]

неважно.


 
Anatoly Podgoretsky ©   (2010-01-21 16:19) [12]

> Плохиш  (21.01.2010 16:13:11)  [11]

Так мы же тебя хвалим, а не ругаем!!!


 
Плохиш ©   (2010-01-21 16:31) [13]


> Anatoly Podgoretsky ©   (21.01.10 16:19) [12]
>
> > Плохиш  (21.01.2010 16:13:11)  [11]
>
> Так мы же тебя хвалим, а не ругаем!!!
>

Блин, а я-то размечтался 8-0 ...<щас забанят>


 
Ганя   (2010-01-22 19:42) [14]


> тогда нужно отходить от этого в использовании записи в файл,
>  а то потом запутаться запросто можно..


Достаточно оставить около объявления записи комментарий, в котором указать, почему packed и куда именно пишется



Страницы: 1 вся ветка

Форум: "Начинающим";
Текущий архив: 2010.03.28;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.48 MB
Время: 0.005 c
2-1264361195
Дмитрий
2010-01-24 22:26
2010.03.28
Scrollbar на panel


4-1231611546
AzzHell
2009-01-10 21:19
2010.03.28
Как узнать размер большого файла


1-1246381367
Чайник
2009-06-30 21:02
2010.03.28
Delphi 2009 - запись с вариантной частью


2-1264495718
Цукор5
2010-01-26 11:48
2010.03.28
Утечка памяти


3-1237159280
VoznikVopros
2009-03-16 02:21
2010.03.28
Как поместить формы, которые взаимодействуют с БД, в DLL?





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский