С сервера приходят пакеты данных следующей структуры
typedef struct s_tagDsDataPacket
{
unsigned char Code;
unsigned short SiteID;
DS_TIME Time;
unsigned short CraneNo;
short Load;
unsigned short Capacity;
short HookRadius;
unsigned short LuffAngle;
short HookHeight;
unsigned short SlewAngle;
unsigned short WindSpeed : 10;
unsigned short WindDir : 6;
unsigned long IP;
unsigned short Fault;
unsigned char ACD;
unsigned short NB;
unsigned long AC;
unsigned long ERR;
unsigned short CRC;
}DS_DATAPACKET, *PDS_DATAPACKET;
Мне нужно получить sizeof и смещение относительно начала структуры полей WindSpeed и WindDir.
Компилятор ругается, что не может получить указатель для битовых полей. Как быть?
typedef struct s_tagDsDataPacket
{
unsigned char Code;
unsigned short SiteID;
DS_TIME Time;
unsigned short CraneNo;
short Load;
unsigned short Capacity;
short HookRadius;
unsigned short LuffAngle;
short HookHeight;
unsigned short SlewAngle;
union
{
struct
{
unsigned short WindSpeed : 10;
unsigned short WindDir : 6;
} Wind;
unsigned short dummy;
} u;
unsigned long IP;
unsigned short Fault;
unsigned char ACD;
unsigned short NB;
unsigned long AC;
unsigned long ERR;
unsigned short CRC;
}DS_DATAPACKET, *PDS_DATAPACKET;
Здравствуйте, Varavva, Вы писали:
V>Мне нужно получить sizeof и смещение относительно начала структуры полей WindSpeed и WindDir. V>Компилятор ругается, что не может получить указатель для битовых полей. Как быть?
задачу уточните
указатель на битовое поле не имеет физического смысла
вы можете получить указатель на какое-либо поле рядом, например, SlewAngle, а там уже прыгать вперед\назад, если надо
Задача унифицировать структуры, приходящие с сервера, через XML описание. Чтобы пользователь без перекомпиляции приложения смог бы заданием XML менять понимание принимаемых данных
В XML описывается каждое поле структуры, с заданием размера и смещения от начала. Не понятно как задавать это для бытовых полей
U>указатель на битовое поле не имеет физического смысла
Почему? Данные есть в пакете? Есть. Значит есть и размер и сдвиг от начала.
Здравствуйте, Varavva, Вы писали:
V>С сервера приходят пакеты данных следующей структуры
V>
V>typedef struct s_tagDsDataPacket
V>{
V> unsigned char Code;
V> unsigned short SiteID;
V> DS_TIME Time;
V> unsigned short CraneNo;
V> short Load;
V> unsigned short Capacity;
V> short HookRadius;
V> unsigned short LuffAngle;
V> short HookHeight;
V> unsigned short SlewAngle;
V> unsigned short WindSpeed : 10;
V> unsigned short WindDir : 6;
V> unsigned long IP;
V> unsigned short Fault;
V> unsigned char ACD;
V> unsigned short NB;
V> unsigned long AC;
V> unsigned long ERR;
V> unsigned short CRC;
V>}DS_DATAPACKET, *PDS_DATAPACKET;
V>
Тут есть две проблемы — padding, alignment и обработка битовых полей компилятором. Это надо учитывать. V>Мне нужно получить sizeof и смещение относительно начала структуры полей WindSpeed и WindDir.
Зачем? Тебе надо взять указатель на массив где этот пакет лежит и грубо сделать преобразование типов, а потом спокойно получать доступ к битовому полю стандартным способом. V>Компилятор ругается, что не может получить указатель для битовых полей. Как быть?
Конечно, ведь битовое поле это фикция.
Здравствуйте, uzhas, Вы писали:
U>Здравствуйте, Varavva, Вы писали:
V>>Почему? Данные есть в пакете? Есть. Значит есть и размер и сдвиг от начала.
U>минимальная адресуемая величина с помощью указателя — байт U>биты — это мельче, чем байт, поэтому их принципиально нельзя адресовать указателями
U>то же самое с размером. sizeof — это про байты. мельче не посчитать
Здравствуйте, Varavva, Вы писали:
V>Здравствуйте, Kernan, Вы писали:
K>>Зачем? Тебе надо взять указатель на массив где этот пакет лежит и грубо сделать преобразование типов
V>Когда этот самый "тип" есть, то понятно. А когда идет рантаймная генерация типа структуры из XML — не понятно как быть.
ну можно пойти таким путем: на уровне xml поддержать битовую адресацию
то есть поле задается так:
[name, bitOffsetFromStart, bitSize]
как собрать эту статистику из имеющейся struct — отдельный вопрос. тут, возможно, внешняя тулза понадобиться или макросами что-то руками наваять под каждую структуру
если в рантайме кто-то пишет значения поля, то сначала проверяем, что можно байтовыми операциями отделаться, если не может, то уже с битами прыгаем
Здравствуйте, Varavva, Вы писали:
V>Здравствуйте, Kernan, Вы писали:
K>>Зачем? Тебе надо взять указатель на массив где этот пакет лежит и грубо сделать преобразование типов
V>Когда этот самый "тип" есть, то понятно. А когда идет рантаймная генерация типа структуры из XML — не понятно как быть.
Момет таки компайл-тайм?
V>typedef struct s_tagDsDataPacket
V>{
V> unsigned char Code;
V> unsigned short SiteID;
V> DS_TIME Time;
V> unsigned short CraneNo;
V> short Load;
V> unsigned short Capacity;
V> short HookRadius;
V> unsigned short LuffAngle;
V> short HookHeight;
V> unsigned short SlewAngle;
V> unsigned short WindSpeed : 10;
V> unsigned short WindDir : 6;
V> unsigned long IP;
V> unsigned short Fault;
V> unsigned char ACD;
V> unsigned short NB;
V> unsigned long AC;
V> unsigned long ERR;
V> unsigned short CRC;
V>}DS_DATAPACKET, *PDS_DATAPACKET;
V>
V>Мне нужно получить sizeof и смещение относительно начала структуры полей WindSpeed и WindDir. V>Компилятор ругается, что не может получить указатель для битовых полей. Как быть?
V>Я не могу менять клиентский хидер.
Заведите дополнительный хидер.
Сделайте функцию упаковки и распаковки пакета в структуру с которой приятно работать.
Или просто заведите нужные себе константы в зависимости от выравнивания и платформы