|
Как сделать структуру из битовых полей минимального размера? |
|
|
|
Sep 30 2015, 15:54
|
Знающий
   
Группа: Свой
Сообщений: 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;
|
|
|
|
3 страниц
1 2 3 >
|
 |
Ответов
(1 - 14)
|
Sep 30 2015, 16:17
|
практикующий тех. волшебник
    
Группа: Участник
Сообщений: 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
|
|
|
|
|
Sep 30 2015, 16:20
|

Гуру
     
Группа: Свой
Сообщений: 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)  выравнивание на байт делали? всякие там прагма паки??? Дивная мысль  - приказать паковать одинокий int. Интересно во что и с чем?
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Sep 30 2015, 19:22
|
Знающий
   
Группа: Свой
Сообщений: 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
|
|
|
|
|
Sep 30 2015, 19:49
|
практикующий тех. волшебник
    
Группа: Участник
Сообщений: 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)  Что это написано? Не осилил  конкретнее какие слова не понятны?
Сообщение отредактировал kolobok0 - Sep 30 2015, 19:50
|
|
|
|
|
Oct 1 2015, 06:14
|
Знающий
   
Группа: Свой
Сообщений: 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 все эти структуры такого размера как мне надо!
|
|
|
|
|
Oct 1 2015, 06:31
|

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

|
QUOTE (kolobok0 @ Sep 30 2015, 22:49)  конкретнее какие слова не понятны? К сожалению все  . Не могу даже ухватиться за какую-то тень мысли  QUOTE (den_po @ Oct 1 2015, 00:17)  sizeof(bool) не обязан быть 1 Именно так! Зависит от платформы и компилятроа. QUOTE (inventor @ Oct 1 2015, 09:14)  единственное что непонятно, почему в борланде BCC32 все эти структуры такого размера как мне надо! Потому, что Борланд  с его феерической традиционной кривизной и наплевательством на стандарты. Сваяли в свое время некий "Паскаль" в отсутствие стандарта, и решили повторить "успех" с Си. Я начинал в свое время BCPP 1.0 - ну очень потом, когда поумнел, ругался.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Oct 1 2015, 06:37
|
Гуру
     
Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136

|
Цитата(zltigo @ Oct 1 2015, 09:31)  Потому, что Борланд  с его феерической традиционной кривизной и наплевательством на стандарты. Сваяли в свое время некий "Паскаль" в отсутствие стандарта, и решили повторить "успех" с Си. Я начинал в свое время 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. Короче, там почти ничего не определено стандартом. Битовые поля отданы на откуп компиляторописателям.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|