При вызове sizeof (_mass_1); возвращается 5, хотя должно быть 4.
До этого писал под Linux:
#pragma pack( 1 )
та же структура
#pragma pack( )
sizeof возвращает 4, как и должно быть.
Подскажите пожалуйста если кто знает, как сделать выравнивание битовых полей структуры в Windows в данном случае,
программа написана в C++Builder 6 .
Здравствуйте, Alirp, Вы писали:
A>Всем привет. A>Я столкнулся со следующей проблемой. A>Есть структура:
A>#pragma pack( push, 1 )
A>struct _mass_1 { A> unsigned char data1 :6; A> unsigned char data2 :2; A> unsigned char data3 :5; A> unsigned char data4 :3; A> unsigned char data5 :5; A> unsigned char data6 :5; A> unsigned char data7 :5; A> unsigned char data8 :1; A>};
A>#pragma pack( pop )
A>При вызове sizeof (_mass_1); возвращается 5, хотя должно быть 4.
А с чего ты взял , что должно быть 4 ? Только изза суммы используемых битов?
#pragma pack — может гарантировать что все биты будут идти подряд , без окон.
А каждый компайлер сам решит сколько решит выделить для хранения переменной типа структуры .
На личном опыте сталкивался с данной проблеммой. А решение зависит от того , в каком контексте
или в какой задаче ты это используешь?
Здравствуйте, Alex34, Вы писали:
A>А с чего ты взял , что должно быть 4 ? Только изза суммы используемых битов? A>#pragma pack — может гарантировать что все биты будут идти подряд , без окон. A>А каждый компайлер сам решит сколько решит выделить для хранения переменной типа структуры . A>На личном опыте сталкивался с данной проблеммой. А решение зависит от того , в каком контексте A>или в какой задаче ты это используешь?
В моем случае я использую битовые структуры следующим образом:
Здравствуйте, Alirp, Вы писали:
A>struct _mass_1 { A> unsigned char data1 :6; A> unsigned char data2 :2; A> unsigned char data3 :5; A> unsigned char data4 :3; A> unsigned char data5 :5; A> unsigned char data6 :5; A> unsigned char data7 :5; A> unsigned char data8 :1; A>};
A>При вызове sizeof (_mass_1); возвращается 5, хотя должно быть 4.
Я думаю, что проблема в выделенном. Под эти 2 поля выделяется 2 целиковых байта.
Сделай аналогичную структуру с unsigned. Тогда точно будет 4 байта.
Здравствуйте, Alirp, Вы писали:
A>Здравствуйте, Alex34, Вы писали:
A>В моем случае я использую битовые структуры следующим образом:
A>unsigned char *send_buf; A>send_buf = new гтышптув char [MAX_LEN_BUF]; A>_mass_1 *s = (_mass_1 *) &send_buf[0];
A>Причем может идти подряд ни одна битовая структура, поэтому важно чтобы данные шли подряд A>и соответствовали размеру.
судя по всему речь идет у тебя об отображении буффера канала связи на структуру данных в памяти , которая по этому каналу передаються.
Мы раньше тоже так делали , но после некоторых проблем поменяли концепцию.
Во первых проблема , которую ты упомянул. Нельзя надеятся на компилятор , как он разместит данные в памяти. Во вторых всевозможные проблемы с Big/Little Endian и т.д.
Мы создали фреймворк который производит сериализацию/десериализацию данных в буффер сообщения учитывая позицию каждого элемента в битах и длину этого елемента в битах. То есть буффер сообщения СТРОИТСЯ , а не ОТОБРАЖАЕТСЯ на память.
Все это написал , надеясь что понял твою проблему.
Здравствуйте, Alex34, Вы писали:
A>Здравствуйте, Alirp, Вы писали:
A>>Здравствуйте, Alex34, Вы писали:
A>>В моем случае я использую битовые структуры следующим образом:
A>>unsigned char *send_buf; A>>send_buf = new гтышптув char [MAX_LEN_BUF]; A>>_mass_1 *s = (_mass_1 *) &send_buf[0];
A>>Причем может идти подряд ни одна битовая структура, поэтому важно чтобы данные шли подряд A>>и соответствовали размеру.
A>судя по всему речь идет у тебя об отображении буффера канала связи на структуру данных в памяти , которая по этому каналу передаються. A>Мы раньше тоже так делали , но после некоторых проблем поменяли концепцию. A>Во первых проблема , которую ты упомянул. Нельзя надеятся на компилятор , как он разместит данные в памяти. Во вторых всевозможные проблемы с Big/Little Endian и т.д.
A>Мы создали фреймворк который производит сериализацию/десериализацию данных в буффер сообщения учитывая позицию каждого элемента в битах и длину этого елемента в битах. То есть буффер сообщения СТРОИТСЯ , а не ОТОБРАЖАЕТСЯ на память.
A>Все это написал , надеясь что понял твою проблему.
Спасибо за совет, мне уже подсказали как решить проблему в моем случае. Я тоже стараюсь
не использовать битовые поля для создания буфера, просто в данном случае программа является
иммитатором, и не требует переносимости, а так как надо написать в кротчайший срок решил использовать
битовые поля, сейчас все работает.