Форум: "Основная";
Текущий архив: 2003.11.13;
Скачать: [xml.tar.bz2];
Внизбитовые поля в записях Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.025 c