2012-01-06 5 views
1

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

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

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]); 

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

+0

'(* анит) [я] .next' является указателем «структура анимации»; '& ((* anim) [* tmp])' - это адрес 'animation',' struct' без тега. – pmg

ответ

9
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 struct animation { /* tag used in definition */ 
     unsigned int frames; 
     GLuint *tex; 
     float *time; 
     struct animation *next; /* pointer to another of this structure */ 
    } animation; 
+0

Какое идеальное объяснение! Это немедленно устранило проблему! Спасибо! – eyebrowsoffire

+0

Я бы не сказал, что typedef добавляет беспорядок, поскольку его намерение состоит в том, чтобы _remove_ clutter в остальной части кода, но я думаю, что они обычно злоупотребляют. Я считаю код более удобным для чтения, когда ключевое слово struct используется, особенно в редакторах, которые не имеют интеллектуального выделения синтаксиса для настраиваемых типов. – yak

Смежные вопросы