Предупреждение «Назначение из несовместимого типа указателя» - PullRequest
1 голос
/ 06 января 2012

Я пишу функцию, которая анализирует файл с данными текстуры и анимации и загружает его в некоторые глобальные структуры, которые я объявил. Я получаю предупреждение компилятора «Назначение из несовместимого типа указателя» в определенной строке. В нем много кода, поэтому я просто опубликую здесь важные части.

Во-первых, у меня есть тип структуры данных для моих процедур анимации, как показано ниже:

    typedef struct {
        unsigned int frames;
        GLuint *tex;
        float *time;
        struct animation *next;
    } animation;

Как видите, последняя переменная в структуре - это указатель на другую анимацию, которая по умолчанию используется для завершения анимации.

Вот объявление функции загрузки:

    void LoadTexturePalette(GLuint **texture, animation **anim, const char *filename)

Функция загружает информацию в массив анимаций, отсюда двойной указатель.

В самом конце загрузки каждой анимации из файла извлекается целое число, которое указывает, на какую анимацию (из загруженных), на которую будет указывать «следующий» указатель.

    fread(tmp, 1, 4, file);
    (*anim)[i].next = &((*anim)[*tmp]);

В последней строке я получаю предупреждение компилятора. Я еще не использую эту переменную, поэтому я не знаю, является ли предупреждение проблемой, но у меня возникает ощущение, что мой синтаксис или мой подход могут быть неверными при установке этой переменной.

1 Ответ

9 голосов
/ 06 января 2012
   typedef struct { /* no tag in definition */
       unsigned int frames;
       GLuint *tex;
       float *time;
       struct animation *next; /* pointer to an undefined structure */
   } animation;

Без тега (typedef struct animation { /* ... */ } animation;) любая ссылка на "анимацию структуры" внутри определения структуры является ссылкой на пока еще неопределенную структуру.Поскольку вы используете только указатель на эту неопределенную структуру, компилятор не возражает.

Итак, добавьте тег --- и, возможно, даже избавитесь от typedef: он только добавляет беспорядок :)

    typedef struct animation { /* tag used in definition */
        unsigned int frames;
        GLuint *tex;
        float *time;
        struct animation *next; /* pointer to another of this structure */
    } animation;
...