Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Прямой доступ к DBF, Определение размера записи 
:(
    Опции темы
Thunder2
Дата 13.9.2005, 22:12 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Есть исходник компонент который ломиться на прямую к таблица DBF. Все хорошо , но ... кодировка ! Стал разбирать в исходнике и иот наткнулся на такую штуку:

Имеем определение типа данных "Запись" следующего вида
TdbfField = record
FieldName :array[1..11] of char; { Name of this record }
FieldType :char; { type of record - C,N,D,L,etc. }
fld_addr :longint; { not used }
Width :byte; { total field width of this record }
Decimals :byte; { number of digits to right of decimal }
MultiUser :smallint; { reserved for multi user }
WorkAreaID :byte; { Work area ID }
MUser :smallint; { reserved for multi_user }
SetFields :byte; { SET_FIELDS flag }
Reserved :array[1..4] of byte; { 8 bytes reserved }
end; { record starts }

{оригинальный кусок из исходника}

Казалось бы все просто, но ... далее следует объявление переменной:

var Fld: TdbfField;

Тоже ничего особенного. Но вот непонятная для меня вещь:
выражение SizeOf(Fld) дает значение 32 байта, а выражение
SizeOf(Fld.FieldName)+SizeOf(Fld.FieldType)+SizeOf(Fld.fld_addr)+SizeOf(Fld.Width)
+SizeOf(Fld.Decimals)+SizeOf(Fld.MultiUser)++SizeOf(Fld.WorkAreaID)+SizeOf(Fld.MUser)
+SizeOf(Fld.SetFields)+SizeOf(Fld.Reserved) дает значение 28. Тот же
результат можно получить просуммировав размеры значений полей записи:
11+1+4+1+1+2+1+2+1+4.

smile Как так ? Вот собственно вопрос.

Как ни странно компонент работает из этого исходника на "живой" форме. Ошибок при работе не возникает, но ,еще раз повторюсь, DBF файл из VFP 5.0 отображает (как я понял) по DOS-кодировке.
  Вверх
bas
Дата 14.9.2005, 15:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 446
Регистрация: 14.8.2002
Где: Молдова, Кишинев

Репутация: 1
Всего: 2



18-32 - зарезервированные байты и в основном не используються.
PM MAIL   Вверх
p0s0l
Дата 14.9.2005, 17:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

Репутация: нет
Всего: 112



Цитата(Thunder2 @ 13.9.2005, 22:12)
Как так ?
Это из-за выравнивания полей в памяти и выравнивания размера структуры... Т.е. она увеличина нарочно до 32 байт, чтобы размер был кратен 4...
(28 - это сумма размеров полей, но где-то между некоторыми полями есть промежуток, поэтому размер структуры например не 28, а 29)...



--------------------
С уважением, г-н Посол.
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Базы данных и репортинг"
Vit
Петрович

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами


Обязательно указание:

1. Базы данных (Paradox, Oracle и т.п.)

2. Способа доступа (ADO, BDE и т.д.)


  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • Вопросы по SQL и вопросы по базам данных не связанные с Дельфи задавать здесь

FAQ раздела лежит здесь!


Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Vit, Петрович.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Базы данных и репортинг | Следующая тема »


 




[ Время генерации скрипта: 0.0421 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.