2

Mix_Music インスタンスを作成しようとすると、「不完全なタイプは許可されていません」というエラーが表示されます。

ただし、Mix_LoadMUS(file); を呼び出す前に、ポインタ ミュージックのアドレスを取得する必要があります。

コード:

Mix_Music *music;

/* I need the memory address here */

music = Mix_LoadMUS(file);

どうすればいいですか?

4

1 に答える 1

3

不完全型

#include " SDL_mixer.h " で問題ないはずです1 , 2 .

コンパイラは、SDL インクルードなしで SDL 関連のコードをコンパイルして、それらの SDL 参照 (Mix_Musi、Mix_LoadMUS など) が何を参照しているのかを伝えることはできません。kekkai.org/roger の SDL_Mixer チュートリアルを参照してください。 3完全な例があります。

1 SDL インクルード ファイル
2 Mix_LOadMUS
3完全な例を含む SDL チュートリアル

--

更新: 音楽アイテムの配列を使用する

これは、スレッドのコード内から、またはポインター変数の割り当てから字句的に分離された任意の場所から、Mix _ Musicへの特定のポインターにアクセスする方法の例です。実際の実装では、動的配列割り当てを使用したい場合があり、ファイルが見つからない場合やロードに失敗した場合などのエラー処理を追加する必要があります。

MEnt.h 初期化モジュールとスレッド モジュールの共通インクルード ファイル:

#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;
}      
于 2010-11-21T06:37:42.033 に答える