|
JLI Spieleprogrammierung
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
Chriss Senior JLI'ler
Anmeldedatum: 18.08.2004 Beiträge: 267
Medaillen: Keine
|
Verfasst am: 01.01.2007, 22:51 Titel: Funktor in einen Funktionspointer konvertieren? |
|
|
Hi, ich bin derzeit dabei mich etwas in FMOD einzuarbeiten. Da ich das ganze objektorientiert machen will habe ich mir eine entsprechende Klasse dafür geschrieben.
Mein Problem ist eine vorgegebene Struktur die zum Erstellen von Sounds notwendig ist. Diese Struktur erwartet für die Callback-Funktion einen Funktionspointer. Nur da ich alles in meiner Klasse habe kann ich nur einen Funktor übergeben, welcher jedoch nicht akzeptiert wird, da es der falsche Typ ist.
Ich denke ein einfaches Casting würde mein Problem lösen, ich weiß nur nicht wie das mit Funktionszeigern und Funktoren geht.
Also ich muss aus
CPP: | FMOD_RESULT F_CALLBACK AudioStreamer::pcmreadcallback(FMOD_SOUND *sound, void *data, unsigned int datalen)
|
das hier machen
CPP: | FMOD_RESULT F_CALLBACK pcmreadcallback(FMOD_SOUND *sound, void *data, unsigned int datalen)
|
um folgende Zuweisung machen zu können
CPP: | _createsoundexinfoPlaying.pcmreadcallback = pcmreadcallback;
|
Ich hoffe das Problem ist soweit verständlich geschildert und ich hoffe das mir da jemand helfen kann.
Grüße |
|
Nach oben |
|
|
DirectXer Dark JLI'ler
Anmeldedatum: 05.02.2005 Beiträge: 1201 Wohnort: Köln Medaillen: Keine
|
Verfasst am: 01.01.2007, 23:12 Titel: |
|
|
also, wenn ich das richtig verstanden habe, willst du aus einer thiscall Funktion eine stdcall Funktion machen? thiscall F. sind die Memberfunktionen von Klassen etc., und stdcall sind meist globale Funktionen. Da Funktionszeiger immer nur für die entsprechnde call-Eigenschaft definert sind, wird das ohne weiteres nicht gehen. Du kannst aber folg. machen: Du schreibst dir eine globale Funktion, die deine Memberfunktion aufruft, also eine Weiterleitungsfunktion.
btw: wens interessiert: in der STL gibts dafür auch eine Lösung, funktioniert aber nicht mit den gewöhnlichen Funktionszeigern von C. Dort wird das ganze mit Funktionsobj. gemacht; also Klassen/Strukturen, die den operator() definieren und daher wie gewöhliche Funktionen aufgerufen werden können. Dort gibts auch Klassen die für thiscall-Funktionen definiert sind, wie z.B. std::mem_fun_t oder std::mem_fun_ref_t
Gruß DXer |
|
Nach oben |
|
|
Jonathan_Klein Living Legend
Alter: 37 Anmeldedatum: 17.02.2003 Beiträge: 3433 Wohnort: Siegerland Medaillen: Keine
|
Verfasst am: 01.01.2007, 23:51 Titel: |
|
|
jop, ist genau das selbe Problem wie bei Windows mit den Callbackfunktionen.
Denn die Methoden müssen ja wissen, von welchem Objekt sie aufgerufen werden, damit sie die Daten des richtigen Objektes manipulieren.
Ein FUnktionszeiger kann aber nicht speichern, zu welchem Objekt er gehört, und deshlab kann das so nicht gehen. Du musst halt wie gesagt tricksen. _________________ https://jonathank.de/games/ |
|
Nach oben |
|
|
Chriss Senior JLI'ler
Anmeldedatum: 18.08.2004 Beiträge: 267
Medaillen: Keine
|
Verfasst am: 02.01.2007, 12:38 Titel: |
|
|
Danke für die Infos.
Ich hab mal ein bischen weitergesucht und eine Lösung für FMOD gefunden.
Die entsprechende Funktion muss einfach nur als 'static' deklariert werden
CPP: | // CALLBACK für das Lesen des Samples
static FMOD_RESULT F_CALLBACK pcmreadcallback(FMOD_SOUND *sound, void *data, unsigned int datalen);
|
Da man so jedoch nicht auf Attribute und Memberfunktionen zugreifen kann muss man dem Sound, dem man die Callbackfunktion zuweist, noch einen Pointer auf das aktuelle Objekt mitgeben um innerhalb der Callbackfunktion darauf zugreifen zu können
CPP: | _createsoundexinfoPlaying.pcmreadcallback = AudioStreamer::pcmreadcallback; /* User callback for reading. */
_createsoundexinfoPlaying.userdata = this; /* pointer to this object */
|
um jetzt innerhalb der Callbackfunktion auf das Objekt zugreifen zu können muss nur noch die Funktion 'getUserData' aufgerufen werden
CPP: | void* Object;
// Sound casten
FMOD::Sound *snd = (FMOD::Sound *)sound;
// Pointer auf das Objekt holen
snd->getUserData(&Object);
// Objektpointer casten
MyClass *MyObject = (MyClass*)Object;
|
|
|
Nach oben |
|
|
|
|
Du kannst keine Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum nicht antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen.
|
Powered by phpBB © 2001, 2005 phpBB Group Deutsche Übersetzung von phpBB.de
|