Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.037 c
3-40958
GSV_
2003-10-17 08:31
2003.11.13
Специалистам по Oacle. Вопрос про snapshot


3-40998
Denius
2003-10-15 18:25
2003.11.13
Кто работал с TDBF? Хелп, плиз, нарыть по нему доков...


1-41246
pashaz
2003-11-04 19:20
2003.11.13
Try Except


3-40927
Sulimxar
2003-10-12 23:21
2003.11.13
Перенос преложений БД на другие машины


1-41149
Денисыч
2003-11-03 13:44
2003.11.13
зависание приложения





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский