2010-11-20 11 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.もの含めます* Mix_Music *と* Mix_LoadUS *を宣言するヘッダーファイル。 2.明らかにあなたはポインタ音楽のアドレスは必要ありません。 1つの関数しか表示されず、ポインタのアドレスは必要ないためです。 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 *を割り当てます。* static *や* malloc()*や* new *を使うと、他の場所に置くことができます。そのアドレスは "&mmus";"ですが、それはMIX_LoadMUS()からのものではなく、任意の* Mix_Music、*のアドレスであり、Mix_LoadMUS()が独自の構造体を割り当てているため有用なアドレスではありません。 – frayser

答えて

3

不完全な型

の#include "SDL_mixer.h" と、それは21問題ないはずです。

コンパイラは、これらのSDL参照(Mix_Musi、Mix_LoadMUSなど)が参照するものを示すために、SDLインクルードなしでSDL関連のコードをコンパイルすることはできません。 kekkai.org/roger 3のSDL_Mixerチュートリアルを参照してください。完全な例があります。これは方法の例である音楽アイテム

のアレイを用いた:

アップデート -

1 SDLは完全な例で 3 SDLチュートリアル

Mix_LOadMUS
ファイル
2を含めますへの特定のポインタにアクセスするには、 _ 音楽からスレッドのコード内、またはポインタ変数の割り当てと語彙的に離れている場所。実際の実装では、動的配列割り当てを使用し、ファイルが見つからない、またはロードに失敗したなどのエラー処理を追加する必要があります。

MEnt.h initilizationおよびスレッドモジュールの共通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; 
}  
関連する問題