list_entry () в list.h возвращает предупреждение - PullRequest
0 голосов
/ 17 февраля 2011

Рассмотрим этот кусок кода:

 struct Trade
        {
         float Price;
             char* time;
             int shares;
             struct list_head *tradeList;
        };
typedef struct Trade Trade;

    void DisplayTrades(Trade* TBook)
        {
            if(TBook==NULL)
            {
                printf("NO TRADES\n");
                return;
            }
            struct list_head *pos;
            Trade *tmp;
            pos = TBook->tradeList;
            __list_for_each(pos,TBook->tradeList)
            {
                tmp = list_entry((pos),Trade,tradeList);
                printf("Price %f, Time %s, Shares %d\n",tmp->Price,tmp->time,tmp->shares);
            }

        }

В этом коде, когда я компилирую, компилятор gcc возвращает предупреждение, что initialization from incompatible pointer type в строке, где вызывается list_entry. Я использовал list_entry в других местах того же кода, и он работает без сбоев. Таким образом, единственное, что поразило меня, это, возможно, то, что я передал в функцию непреднамеренные типы переменных и, следовательно, приложил определение структуры Trade. Проблема сохраняется даже тогда.

Был бы признателен, если бы знал, где что-то идет не так.

РЕДАКТИРОВАТЬ : Это всего лишь небольшой фрагмент из большого кода. Я прошу прощения за то, что я выгляжу так, что пытаюсь использовать объект Trade *, когда его нет В коде я действительно использовал typedef для определения struct Trade;

Ответы [ 2 ]

3 голосов
/ 17 февраля 2011

Чтобы это работало, pos должен быть фактическим указателем заголовка списка, но структурное поле должно быть list_head, а не указателем list_head:

struct Trade
        {
             float Price;
             char* time;
             int shares;
             struct list_head tradeList;
        };

А затем:

  void DisplayTrades(Trade* TBook)
        {
            if(TBook==NULL)
            {
                printf("NO TRADES\n");
                return;
            }
            struct list_head *pos;
            Trade *tmp;
            __list_for_each(pos,&TBook->tradeList)
            {
                tmp = list_entry((pos),Trade,tradeList);
                printf("Price %f, Time %s, Shares %d\n",tmp->Price,tmp->time,tmp->shares);
            }

        }
0 голосов
/ 17 февраля 2011

In DisplayTrades функция при объявлении указателя структуры торговли в качестве аргумента, который вы должны использовать

struct Trade * Tbook.

...