JLI Spieleprogrammierung Foren-Übersicht JLI Spieleprogrammierung

 
 FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen 
 medals.php?sid=1f730fd09abd6f4d4c361aae20a26900Medaillen   RegistrierenRegistrieren   ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin 

Funktor in einen Funktionspointer konvertieren?

 
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Entwicklung
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
Chriss
Senior JLI'ler



Anmeldedatum: 18.08.2004
Beiträge: 267

Medaillen: Keine

BeitragVerfasst am: 01.01.2007, 22:51    Titel: Funktor in einen Funktionspointer konvertieren? Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
DirectXer
Dark JLI'ler



Anmeldedatum: 05.02.2005
Beiträge: 1201
Wohnort: Köln
Medaillen: Keine

BeitragVerfasst am: 01.01.2007, 23:12    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Jonathan_Klein
Living Legend


Alter: 37
Anmeldedatum: 17.02.2003
Beiträge: 3433
Wohnort: Siegerland
Medaillen: Keine

BeitragVerfasst am: 01.01.2007, 23:51    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Chriss
Senior JLI'ler



Anmeldedatum: 18.08.2004
Beiträge: 267

Medaillen: Keine

BeitragVerfasst am: 02.01.2007, 12:38    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Entwicklung Alle Zeiten sind GMT
Seite 1 von 1

 
Gehe zu:  
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

Impressum