불완전한 유형
사용법 #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 ¤t=Marray[Mselected];
if(!(music=current.music) &&
(current.filename!=NULL))
music=current.music=
Mix_LoadMUS(current.filename);
}
return music;
}
1의 inclu * Mix_Music * 및 * Mix_LoadUS *를 선언하는 헤더 파일. 2. 분명히 포인터 음악의 주소는 필요하지 않습니다. 함수 하나만 보여주고 포인터의 주소는 필요 없기 때문입니다. 3. 코드는 'Mix_Music * music = Mix_loadMUS (file);'로 단순화 될 수 있습니다. – frayser
맞아요, 전체 코드를 표시하지 않습니다. 핵심은 거기에 파일을로드 할 스레드에 메모리 주소를 전달해야한다는 것입니다. 그래서 어떤 종류의리스트/맵에 빈 Mix_Music을 추가하고 스레드에 메모리 주소를 전달하고 싶습니다. 스레드가 파일을로드할지 여부를 결정합니다. 그것은 다른 클래스들과 잘 동작하지만 Mix_Music을 가지고 어떻게해야하는지 모르겠습니다. 헤더가 포함됩니다. – Klokop
"음악"의 주소, "& 음악", 빈 "Mix_Music"의 주소는 다른 것입니다. "& music"은 Mix_LoadMUS()가 호출 될 때까지 아무데도 * 포인터의 주소입니다. 이후에 "& music"은 새로 할당 된 struct _Mix_Music *의 주소를 가리 킵니다. "Mix_Music mmus;" 스택에 빈 * Mix_Music *을 할당합니다.* 정적 * 또는 * malloc() * 또는 * new *를 사용하면 다른 곳에 넣을 수 있습니다. 그 주소는 "&mmus";"이 될 것입니다. 그러나 MIX_LoadMUS()의 임의의 * Mix_Music, * 주소가 아닙니다. Mix_LoadMUS()가 자신의 구조체를 할당했기 때문에 유용한 주소가 아닙니다 – frayser