2010-11-20 2 views
1

Mix_Music 인스턴스를 만들 때마다 "불완전한 유형이 허용되지 않습니다."라는 오류가 발생합니다.C++ SDL 믹서 Mix_Music : 불완전 유형이 허용되지 않습니다.

그러나 Mix_LoadMUS (파일)를 호출하기 전에 포인터 음악의 주소를 가져와야합니다.

코드 :

Mix_Music *music; 

/* I need the memory address here */ 

music = Mix_LoadMUS(file); 

내가 이걸 어떻게해야합니까?

+1

1의 inclu * Mix_Music * 및 * Mix_LoadUS *를 선언하는 헤더 파일. 2. 분명히 포인터 음악의 주소는 필요하지 않습니다. 함수 하나만 보여주고 포인터의 주소는 필요 없기 때문입니다. 3. 코드는 'Mix_Music * music = Mix_loadMUS (file);'로 단순화 될 수 있습니다. – frayser

+0

맞아요, 전체 코드를 표시하지 않습니다. 핵심은 거기에 파일을로드 할 스레드에 메모리 주소를 전달해야한다는 것입니다. 그래서 어떤 종류의리스트/맵에 빈 Mix_Music을 추가하고 스레드에 메모리 주소를 전달하고 싶습니다. 스레드가 파일을로드할지 여부를 결정합니다. 그것은 다른 클래스들과 잘 동작하지만 Mix_Music을 가지고 어떻게해야하는지 모르겠습니다. 헤더가 포함됩니다. – Klokop

+1

"음악"의 주소, "& 음악", 빈 "Mix_Music"의 주소는 다른 것입니다. "& music"은 Mix_LoadMUS()가 호출 될 때까지 아무데도 * 포인터의 주소입니다. 이후에 "& music"은 새로 할당 된 struct _Mix_Music *의 주소를 가리 킵니다. "Mix_Music mmus;" 스택에 빈 * Mix_Music *을 할당합니다.* 정적 * 또는 * malloc() * 또는 * new *를 사용하면 다른 곳에 넣을 수 있습니다. 그 주소는 "&mmus";"이 될 것입니다. 그러나 MIX_LoadMUS()의 임의의 * Mix_Music, * 주소가 아닙니다. Mix_LoadMUS()가 자신의 구조체를 할당했기 때문에 유용한 주소가 아닙니다 – frayser

답변

3

불완전한 유형

사용법 #include "SDL_mixer.h"그것은 잘 1, 2해야합니다.

컴파일러는 해당 SDL 참조 (Mix_Musi, Mix_LoadMUS 등)가 참조하는 것을 알려주기 위해 SDL 포함없이 SDL 관련 코드를 컴파일 할 수 없습니다. kekkai.org/roger 3에서 SDL_Mixer 자습서를 참조하십시오. 완전한 예제가 있습니다.

1 SDL은 완전한 예제 파일을
2 Mix_LOadMUS
3 SDL 튜토리얼을 포함

-

업데이트 : 음악 항목의 배열을 사용하여

이 방법의 예입니다 특정 포인터 에 액세스하려면 _ 음악은 스레드 코드 내에서 또는 포인터 변수를 어휘 적으로 분리하여 배치 할 수 있습니다. 실제 구현에서는 동적 배열 할당을 사용하고 파일이 발견되지 않거나로드에 실패한 경우 오류 처리를 추가해야 할 수 있습니다.

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; 
}  
관련 문제