Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Указатели
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > Программирование
Kesha
Добрый день.
Есть такая строчка в 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;
rvk
может так :
byte *pD1 = (byte*)pD;
pD1 += pD->bLength;
pD = (USB_COMMON_DESCRIPTOR*)pD1;
SSerge
Чтобы было всё ОК менять надо явно больше одной строчки.
Указатель-то на структуру, а продвигают его на какое-то количество байт. Нехорошо, ибо зависит от компилятора и его манер обращения со структурами, пусть даже и __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 в указатель на структуру.
Kesha
спсб всем.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.