Добрый день.
Есть такая строчка в KEIL (usb_hid for ARM) "(BYTE *)pD += pD->bLength;". Решиш перевести это на CrossStudio. При компиляции вылазит ошибка: "invalid lvalue in assignment". Не подскажете, чем её заменить чтобы было всё ок?
А вот структура:
/* USB Common Descriptor */
typedef struct _USB_COMMON_DESCRIPTOR {
BYTE bLength;
BYTE bDescriptorType;
}__attribute__ ((__packed__)) USB_COMMON_DESCRIPTOR;
Указатель на структуру:
USB_COMMON_DESCRIPTOR *pD;
может так :
byte *pD1 = (byte*)pD;
pD1 += pD->bLength;
pD = (USB_COMMON_DESCRIPTOR*)pD1;
Чтобы было всё ОК менять надо явно больше одной строчки.
Указатель-то на структуру, а продвигают его на какое-то количество байт. Нехорошо, ибо зависит от компилятора и его манер обращения со структурами, пусть даже и __attribute__ ((__packed__)).
Формально заменяется на
pD = (USB_COMMON_DESCRIPTOR *) ((BYTE *)pD + pD->bLength);
или
pD += (pD->bLength)/sizeof(USB_COMMON_DESCRIPTOR);
в зависимости от того, что имел в виду автор.
P.S. Сообразил что, вероятно, имелось в виду.
Если это разбирательство на нижнем уровне с последовательностью записей различной длинны, и всё это описано в виде количества байт и смещений в байтах от одного заголовка до следующего, то может быть так будет более естественно:
BYTE *p;
#define bLength (0)
#define bDescriptorType (1)
BYTE *p;
p += p[bLength];
if( p[bDescriptorType] == ... )
А если уж потребовалось поработать со структурой, то только тогда преобразовывать p в указатель на структуру.