struct -> bit field -> offsetof()
От: Zberik  
Дата: 19.09.06 14:35
Оценка:
Здравствуйте, уважаемый All
Помогите пожалуйста в следующем деле — необходимо вычислить оффсет по размерности бита (а не char) битового поля в струтурах.
Условия:
1) существуют разные структуры S1, S2, ..., SN
2) в каждой структуре как то неравномерно расположены разные переменные, среди которых есть битовые поля,никакого закона в их расположении внутри структуры нет, за исключением того, что битовые поля должны быть выровнены по байту.
Например,

#ifndef BIT_FIELD_TYPE
#if (_MSC_VER <= 600)
#define BIT_FIELD_TYPE unsigned int
#else
#define BIT_FIELD_TYPE unsigned short
#endif
#endif

#pragma pack(1)
typedef struct S1 {
char a[17];
double d;
BIT_FIELD_TYPE bf0 :1;
BIT_FIELD_TYPE bf1 :1;
BIT_FIELD_TYPE bf2 :1;
BIT_FIELD_TYPE bf3 :1;
BIT_FIELD_TYPE bf4 :1;
BIT_FIELD_TYPE bf5 :1;
BIT_FIELD_TYPE bf6 :1;
BIT_FIELD_TYPE bf7 :1;
char asdf[128]
}
#pragma pack()

Хотелось бы получить что-то типа
int offset = offsetofBit(S1, bf4) // == 204
offset = offsetofBit(S1, bf1) // == 200

Как это реализовать наиболее эффективно?
Re: struct -> bit field -> offsetof()
От: Аноним  
Дата: 20.09.06 12:41
Оценка:
Здравствуйте, Zberik, Вы писали:

[]

Z>Хотелось бы получить что-то типа

Z>int offset = offsetofBit(S1, bf4) // == 204
Z>offset = offsetofBit(S1, bf1) // == 200

Z>Как это реализовать наиболее эффективно?


Если без ручного задания смещений, то переносимо -- никак (стандарт не особо щедр в плане битовых полей). Я и компиляторозависимых способов не знаю.

А так, можно что-то вроде следующего:


typedef struct 
{
    int field1 : 2;
    int field2 : 1;
} MY_STRUCT;

/* надо вбивать руками */
#define BIT_OFFSET__MY_STRUCT__field1    0
#define BIT_OFFSET__MY_STRUCT__field2    2


#define OFFSETOF_BIT(struct_name, field_name)    OFFSETOF_BIT_1(BIT_OFFSET__##struct_name##__##field_name)

#define OFFSETOF_BIT_1(macro)                    OFFSETOF_BIT_2(macro)
#define OFFSETOF_BIT_2(macro)                    macro


Только имейте в виду, что расположение битовых полей стандартом не специфицировано.
Re: прекомпиллер?
От: Erop Россия  
Дата: 20.09.06 18:40
Оценка:
Здравствуйте, Zberik, Вы писали:

Z>Хотелось бы получить что-то типа

Z>int offset = offsetofBit(S1, bf4) // == 204
Z>offset = offsetofBit(S1, bf1) // == 200

Z>Как это реализовать наиболее эффективно?


Я бы написал прекомпилер такого хедера. Правда пришлось бы модифицировать прекомпиллер для каждого из компиляторов.
Но если это реально надо, то куда деваться? Правда всё будет исключительно комилятор специфик
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re: struct -> bit field -> offsetof()
От: Аноним  
Дата: 22.09.06 08:17
Оценка:
2Аноним:
Ruchkami ne est good... 8-(

2Erop
E>Я бы написал прекомпилер такого хедера. Правда пришлось бы модифицировать прекомпиллер для каждого из компиляторов.
E>Но если это реально надо, то куда деваться? Правда всё будет исключительно комилятор специфик

V obshem sluchae naverno tolko tak. Vidimo etot vopros otlozhitsya na dolgii srok.
Tema zakrita. Vsem spasibo.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.