реклама на сайте
подробности

 
 
3 страниц V   1 2 3 >  
Reply to this topicStart new topic
> Как сделать структуру из битовых полей минимального размера?
inventor
сообщение Sep 30 2015, 15:54
Сообщение #1


Знающий
****

Группа: Свой
Сообщений: 524
Регистрация: 25-12-08
Из: Москва
Пользователь №: 42 748



Подскажите опции, как сделать подобную структуру 1 байт длины
при всех попытках получается 4 байта

CODE
/**
* Состояние во время работы - 1 байт
*/
typedef struct {
unsigned device_in_runtime : 1;
unsigned acquisition_running : 1;
unsigned gps_sync_ok : 1;
unsigned queue_overrun : 1;
unsigned rsvd0:4;
} RUNTIME_STATE;
Go to the top of the page
 
+Quote Post
kolobok0
сообщение Sep 30 2015, 16:10
Сообщение #2


практикующий тех. волшебник
*****

Группа: Участник
Сообщений: 1 190
Регистрация: 9-09-05
Пользователь №: 8 417



Цитата(inventor @ Sep 30 2015, 18:54) *
Подскажите опции, как сделать подобную структуру 1 байт длины
при всех попытках получается 4 байта
...


выравнивание на байт делали? всякие там прагма паки???
Go to the top of the page
 
+Quote Post
SSerge
сообщение Sep 30 2015, 16:16
Сообщение #3


Профессионал
*****

Группа: Свой
Сообщений: 1 719
Регистрация: 13-09-05
Из: Novosibirsk
Пользователь №: 8 528



А какого размера unsigned int? Правильно, 4 байта.
Хотите 8 бит - используйте соответствующий тип, например uint8_t.


--------------------
Russia est omnis divisa in partes octo.
Go to the top of the page
 
+Quote Post
kolobok0
сообщение Sep 30 2015, 16:17
Сообщение #4


практикующий тех. волшебник
*****

Группа: Участник
Сообщений: 1 190
Регистрация: 9-09-05
Пользователь №: 8 417



не досмотр с меня под вечер..

CODE


typedef struct {
bool device_in_runtime : 1;
bool acquisition_running : 1;
bool gps_sync_ok : 1;
bool queue_overrun : 1;
bool rsvd0:4;
} RUNTIME_STATE;



тип правильный укажите...

Сообщение отредактировал kolobok0 - Sep 30 2015, 16:44
Go to the top of the page
 
+Quote Post
zltigo
сообщение Sep 30 2015, 16:20
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



QUOTE (inventor @ Sep 30 2015, 18:54) *
при всех попытках получается 4 байта

Было-бы странно, если-бы после вашего ПРЯМОГО указания сделать структуру размером int, компилятор смог сделать что-то другое.


QUOTE (kolobok0 @ Sep 30 2015, 19:10) *
выравнивание на байт делали? всякие там прагма паки???

Дивная мысль sm.gif - приказать паковать одинокий int. Интересно во что и с чем?


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
scifi
сообщение Sep 30 2015, 16:35
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Цитата(zltigo @ Sep 30 2015, 19:20) *
Было-бы странно, если-бы после вашего ПРЯМОГО указания сделать структуру размером int, компилятор смог сделать что-то другое.

Я немного разжую замечание коллеги.
А вы в курсе, что unsigned - это unsigned int? Вопрос номер два: а вы не пробовали написать unsigned char? Ну или uint8_t?
Go to the top of the page
 
+Quote Post
ViKo
сообщение Sep 30 2015, 17:01
Сообщение #7


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Правильно колобок говорил: паки-паки... Никакие char в битовом поле ни на что не влияют. Задано поле 1 бит, таким и будет.

Ой! Посмотрел, как я пишу. Задаю везде uint8_t xxx : 1; laughing.gif
Go to the top of the page
 
+Quote Post
kolobok0
сообщение Sep 30 2015, 17:16
Сообщение #8


практикующий тех. волшебник
*****

Группа: Участник
Сообщений: 1 190
Регистрация: 9-09-05
Пользователь №: 8 417



Цитата(ViKo @ Sep 30 2015, 20:01) *
Правильно колобок говорил: паки-паки.....


там ТС юзает не битовые поля. если начнёт юзать - то паки собственно и не нужны.
ну по крайней мере у меня так иар ся ведёт...
Go to the top of the page
 
+Quote Post
zltigo
сообщение Sep 30 2015, 18:02
Сообщение #9


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



QUOTE (kolobok0 @ Sep 30 2015, 20:16) *
там ТС юзает не битовые поля. если начнёт юзать - то паки собственно и не нужны.

Что это написано? Не осилил sad.gif


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
inventor
сообщение Sep 30 2015, 19:22
Сообщение #10


Знающий
****

Группа: Свой
Сообщений: 524
Регистрация: 25-12-08
Из: Москва
Пользователь №: 42 748



Цитата(kolobok0 @ Sep 30 2015, 19:17) *
не досмотр с меня под вечер..

CODE


typedef struct {
bool device_in_runtime : 1;
bool acquisition_running : 1;
bool gps_sync_ok : 1;
bool queue_overrun : 1;
bool rsvd0:4;
} RUNTIME_STATE;



тип правильный укажите...


ставил и pragma pack(1) и
__attrib__ ((packed))
попробую завтра поменять unsigned на u8
меня сбило с толку что в борланде размер этой структуры
получился 1 байт
хотя то же стояло unsigned

Go to the top of the page
 
+Quote Post
kolobok0
сообщение Sep 30 2015, 19:49
Сообщение #11


практикующий тех. волшебник
*****

Группа: Участник
Сообщений: 1 190
Регистрация: 9-09-05
Пользователь №: 8 417



Цитата(inventor @ Sep 30 2015, 22:22) *
ставил и ...


CODE


typedef struct {
bool device_in_runtime : 1;
bool acquisition_running : 1;
bool gps_sync_ok : 1;
bool queue_overrun : 1;
bool rsvd0:4;
} RUNTIME_STATE;



тупо скопируйте тот код что запостил я.
потом компильнитесь и посмотрите отличия от Вашего варианта...


Цитата(zltigo @ Sep 30 2015, 21:02) *
Что это написано? Не осилил sad.gif


конкретнее какие слова не понятны?

Сообщение отредактировал kolobok0 - Sep 30 2015, 19:50
Go to the top of the page
 
+Quote Post
den_po
сообщение Sep 30 2015, 21:17
Сообщение #12


Частый гость
**

Группа: Участник
Сообщений: 139
Регистрация: 9-11-12
Из: Санкт-Петербург
Пользователь №: 74 315



sizeof(bool) не обязан быть 1
Go to the top of the page
 
+Quote Post
inventor
сообщение Oct 1 2015, 06:14
Сообщение #13


Знающий
****

Группа: Свой
Сообщений: 524
Регистрация: 25-12-08
Из: Москва
Пользователь №: 42 748



Цитата(kolobok0 @ Sep 30 2015, 22:49) *
CODE


typedef struct {
bool device_in_runtime : 1;
bool acquisition_running : 1;
bool gps_sync_ok : 1;
bool queue_overrun : 1;
bool rsvd0:4;
} RUNTIME_STATE;



тупо скопируйте тот код что запостил я.
потом компильнитесь и посмотрите отличия от Вашего варианта...

конкретнее какие слова не понятны?



поменял unsigned на u8 - все стало правильно.
спасибо за подстказку.
единственное что непонятно, почему в борланде BCC32 все эти структуры
такого размера как мне надо!
Go to the top of the page
 
+Quote Post
zltigo
сообщение Oct 1 2015, 06:31
Сообщение #14


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



QUOTE (kolobok0 @ Sep 30 2015, 22:49) *
конкретнее какие слова не понятны?

К сожалению все sad.gif. Не могу даже ухватиться за какую-то тень мысли sad.gif


QUOTE (den_po @ Oct 1 2015, 00:17) *
sizeof(bool) не обязан быть 1

Именно так! Зависит от платформы и компилятроа.




QUOTE (inventor @ Oct 1 2015, 09:14) *
единственное что непонятно, почему в борланде BCC32 все эти структуры
такого размера как мне надо!

Потому, что Борланд sad.gif с его феерической традиционной кривизной и наплевательством на стандарты. Сваяли в свое время некий "Паскаль" в отсутствие стандарта, и решили повторить "успех" с Си. Я начинал в свое время BCPP 1.0 - ну очень потом, когда поумнел, ругался.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
scifi
сообщение Oct 1 2015, 06:37
Сообщение #15


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Цитата(zltigo @ Oct 1 2015, 09:31) *
Потому, что Борланд sad.gif с его феерической традиционной кривизной и наплевательством на стандарты. Сваяли в свое время некий "Паскаль" в отсутствие стандарта, и решили повторить "успех" с Си. Я начинал в свое время BCPP 1.0 - ну очень потом, когда поумнел, ругался.

Я бы так не спешил. Вот читаю в стандарте про битовые поля и до конца понять не могу. Там практически всё "implementation-defined":
Цитата
An implementation may allocate any addressable storage unit large enough to hold a bit-field.
If enough space remains, a bit-field that immediately follows another bit-field in a
structure shall be packed into adjacent bits of the same unit. If insufficient space remains,
whether a bit-field that does not fit is put into the next unit or overlaps adjacent units is
implementation-defined. The order of allocation of bit-fields within a unit (high-order to
low-order or low-order to high-order) is implementation-defined. The alignment of the
addressable storage unit is unspecified.

Короче, там почти ничего не определено стандартом. Битовые поля отданы на откуп компиляторописателям.
Go to the top of the page
 
+Quote Post

3 страниц V   1 2 3 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 21st July 2025 - 06:16
Рейтинг@Mail.ru


Страница сгенерированна за 0.01522 секунд с 7
ELECTRONIX ©2004-2016