C ++ SDL Mixer Mix_Music: неполный тип не допускается - PullRequest
2 голосов
/ 20 ноября 2010

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

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

Код:

Mix_Music *music;

/* I need the memory address here */

music = Mix_LoadMUS(file);

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

1 Ответ

3 голосов
/ 21 ноября 2010

Неполный тип

# включает « SDL_mixer.h », и все должно быть в порядке 1 , 2 .

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

1 SDL Включить файл
2 Mix_LOadMUS
3 Учебник по SDL с полным примером

-

Обновление: использование массива музыкальных предметов

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

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;
}      
...