|
Как сделать структуру из битовых полей минимального размера? |
|
|
|
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;
|
|
|
|
|
 |
Ответов
|
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, 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: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. Короче, там почти ничего не определено стандартом. Битовые поля отданы на откуп компиляторописателям.
|
|
|
|
|
Oct 1 2015, 10:29
|
Гуру
     
Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136

|
Цитата(zltigo @ Oct 1 2015, 13:01)  Но не замена ЯВНО указанного размера "юнита" int на восемь бит, как это делает по уверждению автора Борланд. Пруф? Я утверждаю обратное. Там даже вот такое есть: Цитата A bit-field shall have a type that is a qualified or unqualified version of_Bool, signed int,unsigned int, or some other implementation-defined type. И нигде не сказано, что для битового поля будет выделена ячейка памяти, размер которой соответствует указанному типу. Ну просто нигде.
|
|
|
|
|
Oct 1 2015, 12:57
|

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

|
QUOTE (scifi @ Oct 1 2015, 13:29)  И нигде не сказано, что для битового поля будет выделена ячейка памяти, размер которой соответствует указанному типу. Ну просто нигде. А то, что дефиниции int, без разбивки его на биты, размер выделяется "соответствующий указанному типу" и не может быть изменен компиляторописателями где-то написано? Нет? А зачем тогда ВООБЩЕ тип указывается ("bit-field shall have a type") в такой структуре, если он по Вашему мнению ничего не должен значить? Я битовыми полями пользуюсь десятки лет и на десяках компиляторов и платформ. Да, уровень стандартизации невысок  , но на практике, при аккуратном четком описании структур, вылезает в реальности только порядк битов. Выделение явно указанному ТИПУ не его размера памяти есть чистый криминал.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Oct 1 2015, 13:09
|
Гуру
     
Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136

|
Цитата(zltigo @ Oct 1 2015, 15:57)  А то, что дефиниции int, без разбивки его на биты, размер выделяется "соответствующий указанному типу" и не может быть изменен компиляторописателями где-то написано? Нет? Написано: Цитата A "plain" int object has the natural size suggested by the architecture of the execution environment (large enough to contain any value in the range INT_MIN to INT_MAX as defined in the header <limits.h>). Цитата(zltigo @ Oct 1 2015, 15:57)  А зачем тогда ВООБЩЕ тип указывается ("bit-field shall have a type") в такой структуре, если он по Вашему мнению ничего не должен значить? ИМХО, только чтобы различать целое и bool. Ну и знак, естественно. Во всяком случае, из стандарта это следует. Другое дело, что вот это всё "implementation-defined" позволяет использовать размер целого типа как указание компилятору, какими кусками выделять память под битовые поля. Но, повторюсь, это "implementation-defined".
|
|
|
|
|
Oct 1 2015, 13:17
|

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

|
QUOTE (scifi @ Oct 1 2015, 16:09)  ИМХО, только чтобы различать целое и bool Глупость. Хотя-бы по той железобетонной причине, что битовые поля существовали в стандарте тогда, когда никакого _Bool, как нативного типа, и близко не было и различать было просто нечего. QUOTE Написано: Цитата A "plain" int object has the natural size suggested by the architecture of the execution environment (large enough to contain any value in the range INT_MIN to INT_MAX as defined in the header <limits.h>). Наверное Вы что-то пропустили в цитате, ибо я что-то не увидел, что int допускается в структурах содержащих битовые поля МОЖНО выделять МЕНЬШЕ памяти, чем требуется для INT_MAX? Или такого не написано? Тогда к чему цитата?
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Oct 1 2015, 13:35
|
Гуру
     
Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136

|
Цитата(zltigo @ Oct 1 2015, 16:17)  Наверное Вы что-то пропустили в цитате, ибо я что-то не увидел, что int допускается в структурах содержащих битовые поля МОЖНО выделять МЕНЬШЕ памяти, чем требуется для INT_MAX? Или такого не написано? Тогда к чему цитата? Написано, вы просто не стали читать. Напишу снова: Цитата An implementation may allocate any addressable storage unit large enough to hold a bit-field. По-моему, исчерпывающе. Никаких отсылок к размеру типа, используемого при объявлении битового поля. Можете возразить: "Да это же подразумевается, конечно!" На это я возражу, что если такие вещи будут подразумеваться, то и стандарт не нужен, всё ведь и так всем понятно и подразумевается.
|
|
|
|
|
Oct 1 2015, 13:47
|

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

|
QUOTE (scifi @ Oct 1 2015, 16:35)  Можете возразить: "Да это же подразумевается, конечно!" Это НЕ подразумевается это ПРЯМО указывается указанием ТИПА этого самого '"storage unit". QUOTE Никаких отсылок к размеру типа, используемого при объявлении битового поля. Если требование указания ТИПА "storage unit" , не есть такая "отсылка", то что-же это такое  Ну а то, что Вы процитировали это на самом деле СНЯТИЕ требования к компилятору паковать битовые поля из разных "storage unit" стык в стык, если количество биттов МЕНЬШЕ, чем задано типом "storage unit". Вот так просто.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Oct 1 2015, 14:05
|
Гуру
     
Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136

|
Ну что ж, можно констатировать, что есть как минимум два мнения о том, что имелось в виду. Надо править текст стандарта, чтобы двух мнений не было. Кстати, с моей интерпретацией согласны пейсатели книг: Цитата Container size - If packing and straddling is not an issue, does the compiler reliably place a bit field within a container of the user-specified size? We cannot be sure, since the Spec. says an implementation can use "any addressable storage unit large enough" to accomodate the bit field. Взято отсюда.
|
|
|
|
Сообщений в этой теме
inventor Как сделать структуру из битовых полей минимального размера? Sep 30 2015, 15:54 kolobok0 Цитата(inventor @ Sep 30 2015, 18:54) Под... Sep 30 2015, 16:10 SSerge А какого размера unsigned int? Правильно, 4 байта.... Sep 30 2015, 16:16   inventor Цитата(kolobok0 @ Sep 30 2015, 22:49) COD... Oct 1 2015, 06:14             zltigo QUOTE (scifi @ Oct 1 2015, 17:05) Кстати,... Oct 1 2015, 14:20              scifi Цитата(zltigo @ Oct 1 2015, 17:20) Я бы н... Oct 1 2015, 14:52               zltigo QUOTE (scifi @ Oct 1 2015, 17:52) Кстати,... Oct 1 2015, 20:17 zltigo QUOTE (inventor @ Sep 30 2015, 18:54) при... Sep 30 2015, 16:20 scifi Цитата(zltigo @ Sep 30 2015, 19:20) Было-... Sep 30 2015, 16:35 ViKo Правильно колобок говорил: паки-паки... Никакие ch... Sep 30 2015, 17:01 kolobok0 Цитата(ViKo @ Sep 30 2015, 20:01) Правиль... Sep 30 2015, 17:16  zltigo QUOTE (kolobok0 @ Sep 30 2015, 20:16) там... Sep 30 2015, 18:02 den_po sizeof(bool) не обязан быть 1 Sep 30 2015, 21:17 ViKo Похоже, битовое поле должно встраиваться в тот тип... Oct 1 2015, 08:58 scifi Цитата(ViKo @ Oct 1 2015, 11:58) Похоже, ... Oct 1 2015, 09:21  ViKo Цитата(scifi @ Oct 1 2015, 12:21) Более т... Oct 1 2015, 09:30   scifi Фигню я сказал. Очевидно, имеется в виду, что бито... Oct 1 2015, 09:41 esaulenka А можно ещё вопрос, раз уж битовые поля вспомнили?... Oct 2 2015, 06:41 zltigo QUOTE (esaulenka @ Oct 2 2015, 09:41) На ... Oct 2 2015, 08:59 esaulenka Под "ширпотребом" я подразумевал little-... Oct 2 2015, 09:32 Artem_Petrik Цитата(esaulenka @ Oct 2 2015, 12:32) Под... Oct 2 2015, 10:48  ViKo Цитата(Artem_Petrik @ Oct 2 2015, 13:48) ... Oct 2 2015, 12:03
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|