![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Непонятки в типизированном файле [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]ИМХО, разница в размерах из-за выравнивания.