Ошибка компилятора Gcc. Требуется помощь.

  • Автор темы alx
  • Дата начала
A

alx

Гость
#1
собственно скачал драйвера для некого железа. не могу собрать.
есть файл.h
там такой фрагмент кода:
<!--shcode--><pre><code class='с'>#define AE531X_DESC_SWPTR_GET(ptr) \
(void *)(*(volatile UINT32 *) ((UINT32)ptr + AE531X_DESC_SWPTR))

#define AE531X_DESC_SWPTR_SET(ptr,val) \
AE531X_DESC_SWPTR_GET(ptr) = (void *)(val)[/CODE]
и в самой программке
...........
<!--shcode--><pre><code class='с'>AE531X_DESC_SWPTR_SET(txDesc, TxBuf);[/CODE]
вызывает ошибку компилятора error: lvalue required as left operand of assignment...
понимаю, что после преобразований define код получится страшным, но знаний не хватает...
 
K

korisk

Гость
#2
собственно скачал драйвера для некого железа. не могу собрать.
есть файл.h
там такой фрагмент кода:
<!--shcode--><pre><code class='с'>#define AE531X_DESC_SWPTR_GET(ptr) \
(void *)(*(volatile UINT32 *) ((UINT32)ptr + AE531X_DESC_SWPTR))

#define AE531X_DESC_SWPTR_SET(ptr,val) \
AE531X_DESC_SWPTR_GET(ptr) = (void *)(val)[/CODE]
и в самой программке
...........
<!--shcode--><pre><code class='с'>AE531X_DESC_SWPTR_SET(txDesc, TxBuf);[/CODE]
вызывает ошибку компилятора error: lvalue required as left operand of assignment...
понимаю, что после преобразований define код получится страшным, но знаний не хватает...
Получается что-то типа
(void *)(*(volatile UINT32 *) ((UINT32)txDesc + AE531X_DESC_SWPTR)) = (void *)(TxBuf)

чтобы посмотреть во что превращается код можно использовать опцию -E (gcc -E main.c), которая выдает код после разворачивания макросов.

Проблема скорее всего в типе txDesc. Покажите описание переменных.

С уважением.
 
K

korisk

Гость
#4
Интересно для чего проект?
Экзотическая ось такая ) eCos.
А по сути..
Возможно стоит более свежую версию скачать :).

Ещё вариант убрать в макросе:
<!--shcode--><pre><code class='С'>#define AE531X_DESC_SWPTR_GET(ptr)[/CODE]

преобразование (void *), так чтобы получилось
<!--shcode--><pre><code class='С'>#define AE531X_DESC_SWPTR_GET(ptr) \
(*(volatile UINT32 *) ((UINT32)ptr + AE531X_DESC_SWPTR))[/CODE]

Преобразование типа левой части операции присваивания запрещено в современных версиях gcc. (в 4.4) точно.
Так что либо используйте старый gcc, либо ищите новый драйвер, либо правьте согласно рецепту, но там наверное ещё много чего вылезет )
тыц

Удач. :)