реклама на сайте
подробности

 
 
> БАг в компиляторе или не баг
MALLOY2
сообщение Jul 12 2010, 10:00
Сообщение #1


Знающий
****

Группа: Validating
Сообщений: 838
Регистрация: 31-01-05
Пользователь №: 2 317



IAR 5.50.1

Имеем структуру
Код
typedef struct usb_common_descriptor_tag
{
u8_t  bLength;
u8_t  bDescriptorType;
} usb_common_descriptor_t;


Код который выдает ошибку при компиляци
Код
usb_common_descriptor_t *ptr;
...
(u8_t*)ptr += ptr-> bLength;


Ошибка:
Цитата
Error[Pe137]: expression must be a modifiable lvalue ...


Если написать так
Код
usb_common_descriptor_t *ptr;
u8_t *ptr8;
...
ptr8 = (u8_t*)ptr;
ptr8 +=  ptr-> bLength;
ptr = (usb_common_descriptor_t*)ptr8;


Компилирует как надо, это я чего не понимаю или бяка в компилере ?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
MALLOY2
сообщение Jul 12 2010, 10:40
Сообщение #2


Знающий
****

Группа: Validating
Сообщений: 838
Регистрация: 31-01-05
Пользователь №: 2 317



Вы чего то не поняли, ptr-> bLength может быть любая длинна. Это все дескрипторы разного размера собраны в один массив, а этот код предназначен для их перебора в цикле, если я напишу так ptr += ptr-> bLength то ptr будет увеличен на sizeof(usb_common_descriptor_t) * ptr-> bLength, а мне надо увеличить ptr на 7.

P.S. lvalue тут вобще не приделах.

Мож так понятней

Код
    ptr = (usb_common_descriptor_t*)&USB_ConfigDescriptor;
    while(ptr->bLength)
    {
      switch (ptr->bDescriptorType)
      {
        case USB_CONFIGURATION_DESCRIPTOR_TYPE:
             ...
          break;
        case USB_INTERFACE_DESCRIPTOR_TYPE:    
             ...
          break;
        case USB_ENDPOINT_DESCRIPTOR_TYPE:      
             ...
          break;
       case USB_VENDOR_STATUS_TYPE:      
             ...
          break;
      }
      (u8_t*)ptr += ptr->bLength;
    };
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jul 12 2010, 10:48
Сообщение #3


Гуру
******

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



QUOTE (MALLOY2 @ Jul 12 2010, 13:40) *
P.S. lvalue тут вобще не приделах.

Совершенно при делах. На 'С' сast lvalue не предусмотрен.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 1st July 2025 - 08:20
Рейтинг@Mail.ru


Страница сгенерированна за 0.0139 секунд с 7
ELECTRONIX ©2004-2016