C++ SDL Mixer Mix_Music: неполный тип не допускается

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

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

Код:

Mix_Music *music;

/* I need the memory address here */

music = Mix_LoadMUS(file);

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


person Klokop    schedule 20.11.2010    source источник
comment
1. Включите заголовочные файлы, в которых объявляются Mix_Music и Mix_LoadUS. 2. Судя по всему не нужен адрес указателя музыки; потому что вы показываете только одну функцию, и ей не нужен адрес указателя. 3. Код можно упростить до Mix_Music *music = Mix_loadMUS(file);   -  person frayser    schedule 21.11.2010
comment
Вы правы, я не показываю весь код. Дело в том, что мне нужно передать адрес памяти потоку, который загрузит туда файл. Поэтому я хотел бы добавить пустой Mix_Music в какой-то список/карту, а затем передать адрес памяти в поток. Это зависит от потока, загрузит ли он туда файл или нет. Он отлично работает с другими классами, но я не знаю, как это сделать с Mix_Music. Заголовки включены.   -  person Klokop    schedule 21.11.2010
comment
Адрес музыки, которой является &music, и адрес пустой Mix_Music — это разные вещи. &music - это адрес указателя в никуда, пока не будет вызван Mix_LoadMUS(). После этого &music указывает на адрес только что выделенной struct _Mix_Music. Mix_Music ммус; выделит в стеке пустой Mix_Music. Использование static или malloc() или new поместит его в другое место. Его адрес будет &mmus; Но это адрес произвольного Mix_Music, а не адрес MIX_LoadMUS(). Это бесполезный адрес, так как Mix_LoadMUS() выделяет свои собственные структуры.   -  person frayser    schedule 22.11.2010
comment
Наличие music в качестве указателя в массиве означает, что поток должен получить доступ к массиву и его индексу. См. обновленный ответ; это слишком много, чтобы вставить сюда.   -  person frayser    schedule 22.11.2010


Ответы (1)


Неполный тип

#include "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;
}      
person frayser    schedule 21.11.2010