Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Непонятки в типизированном файле [D5]


Darts ©   (2002-09-09 14:47:00) 

Есть типизированный файл, полученный из VB
Ниже структура файла для VB
Type TMetaData
BarCode As Double
IDCode As String*10
Name As String*60
End Type

Размер структуры составляет 78 байтов, причем тип Double занимает 8 байтов (на заметку).

Потребовалось мне считать этот файл из Delphi.
Объявил:

TRecord = record
BarCode: Double;
IDCode: String[10];
Name: String[60];
end;

var FRecord: TRecord;

И выяснилось, что размер записи TRecord (безразлично, упакована она или нет) SizeOf(FRecord) = 80 байтов.

Хотя Double (Delphi)занимает 8 байт.

Вопрос: почему такое расхождение в типах данных? И откуда взялось 2 байта?


Darts   (2002-09-09 18:01:00) [1]

Если использовать packed, картина та же (выравнивает строго ка 80 байт, см. первое сообщение.)

Но если воспользоваться предложением от Старый Паскалист (09.09.02 17:17), то все работает (можно опустить packed в массиве Char).

Благодарю за поддержку!


Старый Паскалист   (2002-09-09 17:17:00) [2]

У меня есть предположение, что твою структуру
надо переводить на паскаль так:
(хотя гарантировать не буду)

TRecord = packed record
BarCode: Double;
IDCode: packed array [1..10] of Char;
Name: packed array [1..60] of Char;
end;


Anatoly Podgoretsky   (2002-09-09 16:32:00) [3]

packed record позволяет обрабатывать структуры кратные 1


Старый Паскалист   (2002-09-09 16:22:00) [4]

2Darts
packed record


Darts   (2002-09-09 16:08:00) [5]

Delphi выравнивает record по границам, кратным 4 байтам (выравнивание по двойным словам, т.е DWORD Aligment).

Но, господа, как мне обработать стркутуру, не кратную 4? Какие варианты? Неужто читать как бинарник?


Старый Паскалист   (2002-09-09 15:00:00) [6]

>Вопрос: почему такое расхождение в типах данных? И откуда >взялось 2 байта?

BarCode: Double; // 8 байт
IDCode: String[10]; // размер - 11 байт без выравнивания
Name: String[60]; // размер - 61 байт без выравнивания
Сумма - 80

В старых паскалевских строках был доп. символ ([0]), в к-ром хранилась длина.

Кстати, как устроены строки в Васике, я не знаю. И не уверен, что они бинарно совпадают со старыми паскалевскими.


Darts   (2002-09-09 14:55:00) [7]

Выравнивает струкутру кратной 16? (16 * 5 = 80)

Как все-таки прочитать такой файл? Открыть как двоичный?



Виктор Щербаков   (2002-09-09 14:50:00) [8]

ИМХО, разница в размерах из-за выравнивания.


Наверх

Титульная страница Поиск, карта сайта Написать письмо