2010-11-20 12 views
1

immer wenn ich versuche, Mix_Music Instanz zu erstellen, erhalte ich diesen Fehler: "unvollständiger Typ ist nicht erlaubt".C++ SDL Mixer Mix_Music: unvollständiger Typ ist nicht erlaubt

Allerdings muss ich die Adresse des Zeigers Musik vor dem Aufruf von Mix_LoadMUS (Datei) abrufen;

Code:

Mix_Music *music; 

/* I need the memory address here */ 

music = Mix_LoadMUS(file); 

Wie mache ich das?

+1

1. Inclu die Headerdatei (en), die * Mix_Music * und * Mix_LoadUS * deklarieren. 2. Anscheinend brauchst du die Adresse der Zeigermusik nicht; weil Sie nur eine Funktion anzeigen und die Adresse des Zeigers nicht benötigt. 3. Der Code kann vereinfacht werden zu 'Mix_Music * Musik = Mix_loadMUS (Datei);' – frayser

+0

Sie haben Recht, ich zeige nicht den gesamten Code. Der Punkt ist, dass ich die Speicheradresse an einen Thread übergeben muss, der die Datei dort lädt. Ich möchte also eine leere Mix_Music zu einer Art Liste/Map hinzufügen und dann die Speicheradresse an den Thread übergeben. Es obliegt dem Thread, ob die Datei dort geladen wird oder nicht. Es funktioniert gut mit anderen Klassen, aber ich weiß nicht, wie man es mit Mix_Music macht. Header sind enthalten. – Klokop

+1

Die Adresse von "Musik", die "& Musik" ist, und die Adresse eines leeren "Mix_Music" sind verschiedene Dinge. "& music" ist die Adresse eines * pointer to nowhere *, bis Mix_LoadMUS() aufgerufen wird. Danach zeigt "& music" auf die Adresse eines neu zugewiesenen * struct _Mix_Music *. "Mix_Music mmus;" würde ein leeres * Mix_Music * auf dem Stapel zuweisen.Die Verwendung von * static * oder * malloc() * oder * new * würde es anderswo einfügen. Seine Adresse wäre "&mmus"; Aber das ist die Adresse eines beliebigen * Mix_Music, * nicht eines von MIX_LoadMUS(). Es ist keine nützliche Adresse, da Mix_LoadMUS() seine eigenen Strukturen zugewiesen hat. – frayser

Antwort

3

Unvollständige Typ

#include "SDL_mixer.h" und es sollte in Ordnung 1, 2 sein.

Der Compiler ist nicht in der Lage, SDL-bezogenen Code zu kompilieren, ohne dass die SDL davon ausgeht, worauf sich diese SDL-Referenzen beziehen (Mix_Musi, Mix_LoadMUS, usw.). Sehen Sie das SDL_Mixer-Tutorial unter kekkai.org/roger 3 Es hat ein komplettes Beispiel.

1 SDL Include-Datei
2 Mix_LOadMUS
3 SDL Tutorial mit vollständigeres Beispiel

-

Update:

Dieses ein Array of Music Artikel Verwendung ist ein Beispiel dafür, wie Zugriff auf einen bestimmten Zeiger auf Mischen _ Musik aus dem Code eines Threads oder an einem anderen Ort, der lexikalisch von der Zuweisung der Zeigervariablen getrennt ist. Eine tatsächliche Implementierung möchte möglicherweise die dynamische Array-Zuweisung verwenden und eine Fehlerbehandlung für nicht gefundene oder nicht geladene Dateien usw. hinzufügen.

MEnt.h Eine gebräuchliche iclude-Datei für die Initialisierungs- und Thread-Module:

#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; 

Programminitialisierung:

#include "MEnt.h" 

// Alocate space for array of music items 

MEnt Marray[MAXENTRIES]; 
int Mselected=-1; 

In den Code des Themas, umfassen:

#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; 
}  
Verwandte Themen