Seite 1 von 1
Kleines Problem beim Mischen von C und C++
Verfasst: 24. Dezember 2006 20:42
von BartSimpson
Ich habe in einer C Bibliothek die folgende Funktion:
IS8 CT_keycb(IU16ctn, void (*cb) (void))
Unter C++ soll die Callbackfunktion entstehen.
Welche wie Folgt aussieht:
static void Rueckruf(XXX *quelle)
XXX hat den Sinn, das ich ein Zeiger auf mein C++ Objekt habe.
Nun habe ich versucht das wie folgt aufzurufen:
CT_keycb(K_Nummer,Rueckruf(this));
Nur leider nimmt mir der Compiler das nicht ab:(
Fehler: void-Wert nicht ignoriert wie es sein sollte
Wie muss ich das schreiben, das ich in der Callbackfunktion ein Zeiger auf meine C++ Klasse habe??
Verfasst: 25. Dezember 2006 08:40
von isifloh
hi
als lösung siehe hier
http://www.codeguru.com/cpp/cpp/cpp_mfc ... php/c4129/
bzw. hier
http://www.partow.net/programming/templ ... index.html
unter dem ersten link wird dir auch genau erklärt wieso das problem ist.
mfg
isifloh
Verfasst: 25. Dezember 2006 10:02
von BartSimpson
Nur leider trifft das hier nicht ganz zu.
Dort wird beschrieben, wie man in C++ eine C++ Callbackfunktion aufruft.
Aber in meinem Fall ist es keine C++ sondern eine C Funktion.
Verfasst: 25. Dezember 2006 10:44
von isifloh
hi
ja wie jedoch unter dem ersten link beschrieben hat c++ eine andere aufruf konvention. sprich das c kein this zeiger kennt.
du müsstest also in einer globen variable dir einen zeiger auf this setzen
irgendwo innerhalb deiner klasse bevor der callback das erste mal aktiviert wird.
und deine callback funktion muss als parameter einfach (void) haben.
iinerhalb der callback funktion kannst du dann mit hilfe der globalen variable auf die klasse zugreifen.
falls das noch immer nicht verständlich war kann ich dir auch noch ein code stück posten das dies zeigt.
mfg
isifloh
Verfasst: 25. Dezember 2006 11:46
von BartSimpson
Mit dem this Zeiger ist mir auch langsam eingefallen.
Man macht sowas ja nicht alle Tage:)
So jetzt habe ich meine Funktion nach
K_TasteGerueckt(const uint *terminal) umgeschrieben
In dieser gibt es jetzt ein QHash Feld, was mir den passenden Zeiger holt.
Wenn ich jetzt
CT_keycb(K_Terminalnummer,K_TasteGerueckt,&K_Terminalnummer);
schreibe, meckert der Compiler über:
error: invalid conversion from `void (*)(const uint*)' to `void (*)()'
Verfasst: 25. Dezember 2006 14:56
von BartSimpson
So jetzt sollte es gehen.
Ein Gruß an die Doku der C Bibliothek.
Nur leider scheint diese an der Stelle etwas verbugt:(