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

Тема в разделе "Общие вопросы по С и С++", создана пользователем alx, 23 июн 2010.

  1. alx

    alx Гость

    собственно скачал драйвера для некого железа. не могу собрать.
    есть файл.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 код получится страшным, но знаний не хватает...
     
  2. korisk

    korisk Гость

    Получается что-то типа
    (void *)(*(volatile UINT32 *) ((UINT32)txDesc + AE531X_DESC_SWPTR)) = (void *)(TxBuf)

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

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

    С уважением.
     
  3. alx

    alx Гость

  4. korisk

    korisk Гость

    Интересно для чего проект?
    Экзотическая ось такая ) 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, либо ищите новый драйвер, либо правьте согласно рецепту, но там наверное ещё много чего вылезет )
    тыц

    Удач. :)
     
Загрузка...

Поделиться этой страницей