Главная страница
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.025 c
3-41057
axx
2003-10-24 11:15
2003.11.13
CachedUpdates в TTable


1-41318
ARTEMKA
2003-10-29 23:56
2003.11.13
Прозрачный TPanel


14-42115
Екатерина
2003-10-14 11:58
2003.11.13
Ищу delphi-2 или 3 на дискетах.


14-42063
Rouse_
2003-10-23 12:40
2003.11.13
АТ - команды для Моторолы.


4-42241
Broot
2003-09-16 10:06
2003.11.13
Версия программы