Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.11.13;
Скачать: CL | DM;

Вниз

битовые поля в записях   Найти похожие ветки 

 
Stratos ©   (2003-11-01 02:48) [0]

Тут при переносе одного класса с С++ на Дельфи столкнулся с такой проблемой:
В header файле описаны структуры. Я их переделываю в записи. Важно чтобы размер структуры на С и записи на Object Pascal"е совпадал. Но в некоторых структурах встречаются битовые поля, например: unsigned int some_bit_field: 3;
Вопрос: как корректно отобразить эти битовые поля на Паскаль, причем чтобы размер структур и записей совпадал?
Заранее спасибо.


 
Anatoly Podgoretsky ©   (2003-11-01 11:15) [1]

unsigned int наиболее близкий на момент эквивалент это Cardinal


 
Anatoly Podgoretsky ©   (2003-11-01 11:23) [2]

Можно еще сказать, что int это не переносимый по размеру тип, у него модет быть разный размер в зависимости от платформы, точно также как Integer в Паскале не переносимый. В Паскале есть два понятия о типах Fundamental и Generic, первые всегда имею фиксированый размер, а вторый в зависимости от платформы, версии компилятора. Integer был 16 бит, в текущий момент 32 бита, скоро будет 64 бита. Тоже относится и к int, разберись с размером и тогда можно точно выбрать тип, да и то в зависимости от задачи, нужна ли переносимость по размеру, или переносимость между компиляторами.


 
icWasya ©   (2003-11-03 10:26) [3]

вопрос был не про unsigned int Field; а про unsigned int Field :3;


 
Anatoly Podgoretsky ©   (2003-11-03 10:31) [4]

В этом unsigned int используется только 3 бита


 
Stratos ©   (2003-11-03 11:09) [5]

Блин, icWasya прав - вопрос именно про битовые поля, а не про int - его можно считать 32 бита(в этом конкретном случае)
В данном случае это не важно - важно то, что при наличии строк

unsigned int some_bit_field1: 3;
unsigned int some_bit_field2: 4;
unsigned int some_bit_field3: 5;

Компилятор С сделает выделение памяти в 2 байта (округленные 12 бит). Вопрос заключается в том, как сделать аналог такой вот бяки на Object Pascal"e. Я понимаю, что можно не мучаться и делать поле не по 3-4 бита, а отводить по все 32 - но фишка в том, что размер структур на C++ и Object Pascal"e должен совпадать, так как эта структура может(и должна) быть передана программе на С++(по сокетам).

Есть конечно и такая идея:
Сделать одну структуру для нормальной работы где вместо 3 бит отводится 32, а для использования в тех местах, где нужен размер как в С++, написать функцию, упаковывающую в формат с битовыми полями.

Это конечно не очень красивое решение - может уто-нибудь получше что посоветует?


 
Anatoly Podgoretsky ©   (2003-11-03 11:20) [6]

Fld: Integer (или другой подходящий тип, например word) и использование битовой математики, желательно определить константы бит для удобства.


 
Stratos ©   (2003-11-03 11:48) [7]

Еще проблема в том что битовые поля располагаются в середине стуктуры - то есть сначала идут нормальные данные типа

float some_value;
int some_int;

потом битовые поля, а за ними опять нормальные данные.

Необходимо чтобы совпадал не только размер структур, но и расположение данных в них. Так что если сделать всю структуру массивом битов, то с помощью битовой арифметики конечно можно будет доставать оттуда данные, но будет ли это удобно? ограничение на размер занимаемой памяти и скорость не стоит - главное совместимость. IMHO, дублировать структуру нормальной - проще для использования.



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

Текущий архив: 2003.11.13;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.023 c
1-41459
СержК
2003-10-29 11:02
2003.11.13
DBLookupComboBox


1-41220
Lamak
2003-10-30 16:23
2003.11.13
Languages


14-41895
Тролль
2003-10-20 10:48
2003.11.13
ListBox


1-41465
vil
2003-10-29 08:56
2003.11.13
отчет в FastReport


1-41410
DN
2003-10-29 16:53
2003.11.13
Работа с Install Shield