Главная страница
    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.034 c
14-41942
undert
2003-10-22 21:49
2003.11.13
Вопрос по PHP


14-41896
undert
2003-10-21 18:32
2003.11.13
Подскажите название песни


3-40967
Nucl
2003-10-16 16:39
2003.11.13
Уровни изоляции транзакций


1-41405
Vivk
2003-10-29 19:15
2003.11.13
как програмно выделить строку в StringGrid


4-42251
Wild Sam
2003-09-15 16:35
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
Английский Французский Немецкий Итальянский Португальский Русский Испанский