2010-11-20 5 views
1

всякий раз, когда я пытаюсь создать экземпляр Mix_Music, я получаю эту ошибку: «неполный тип недопустим».C++ SDL Mixer Mix_Music: недопустимый тип недопустим

Однако перед вызовом Mix_LoadMUS (файла) мне нужно получить адрес указательной музыки;

Код:

Mix_Music *music; 

/* I need the memory address here */ 

music = Mix_LoadMUS(file); 

Как мне это сделать?

+1

1. Inclu de заголовочный файл (ы), который объявляет * Mix_Music * и * Mix_LoadUS *. 2. Видимо, вам не нужен адрес музыки указателя; потому что вы показываете только одну функцию, и ей не нужен адрес указателя. 3. Код можно упростить до 'Mix_Music * music = Mix_loadMUS (файл);' – frayser

+0

Вы правы, я не показываю весь код. Дело в том, что мне нужно передать адрес памяти в поток, который будет загружать там файл. Поэтому я хотел бы добавить пустой Mix_Music в какой-то список/карту, а затем передать адрес памяти в поток. Это зависит от того, будет ли он загружать файл или нет. Он отлично работает с другими классами, но я не знаю, как это сделать с Mix_Music. Заголовки включены. – Klokop

+1

Адрес «музыка», который есть «& music», и адрес пустой «Mix_Music» - это разные вещи. «& music» - это адрес указателя * в никуда *, пока не вызывается Mix_LoadMUS(). После этого «& music» указывает на адрес недавно выделенной * struct _Mix_Music *. "Mix_Music mmus;" выделил бы пустой * Mix_Music * в стеке.Использование * static * или * malloc() *, или * new * будет помещено в другое место. Его адрес будет «&mmus"; Но это адрес произвольного * Mix_Music, * не один из MIX_LoadMUS(). Это не полезный адрес, так как Mix_LoadMUS() выделил свои собственные структуры. – frayser

ответ

3

Неполное Тип

#include "SDL_mixer.h", и это должно быть хорошо 1, 2.

Компилятор не может скомпилировать код, связанный с SDL, без включения SDL, чтобы сообщить ему, что ссылки на эти SDL ссылаются (Mix_Musi, Mix_LoadMUS и т. Д.). См. Учебник SDL_Mixer по адресу kekkai.org/roger 3 В нем есть полный пример.

1 SDL инклюднике
2 Mix_LOadMUS
3 SDL Учебник с полным примером

-

Update: Использование массива музыкального Items

Это пример того, как для доступа к конкретному указателю на Mix _ Музыка из кода нити или в любом месте лексически отделена от выделения переменной указателя. Фактическая реализация может захотеть использовать динамическое распределение массивов и должна добавить обработку ошибок для не найденных файлов или неудачных при загрузке и т. Д.

MEnt.h Общий файл iclude для модулей инициализации и потоков:

#include <cstdlib> 
#include "SDL.h" 
#include "SDL_mixer.h" 

enum { MAXENTRIES=1024 }; 
struct MEnt{ 
     Mix_Music * music; 
     char *filename; 
}; 

extern MEnt Marray[MAXENTRIES]; 
extern int Mselected; 

инициализации программы:

#include "MEnt.h" 

// Alocate space for array of music items 

MEnt Marray[MAXENTRIES]; 
int Mselected=-1; 

В коде потока, включают в себя:

#include "MEnt.h" 
// Return a pointer for the selected music item: 
// Allocate new Mix_Music* if not already done, 
// otherwise return the already allocated pointer. 
Mix_Music *getSelected(){ 
    Mix_Music *music; 

    if(Mselected >= 0 && Mselected < MAXENTRIES){ 
     struct MEnt &current=Marray[Mselected]; 
     if(!(music=current.music) && 
        (current.filename!=NULL)) 
      music=current.music= 
        Mix_LoadMUS(current.filename); 
    } 
    return music; 
}  
Смежные вопросы