glutDisplayFunc eine Funktion aus einer Klasse übergeben?
-
Heyho,
erstmal vielen Dank für die schnelle Antwort.
Leider gottes bin ich von der Hochschule aus dazu gezwungen glut und c++ zu verwenden.
Allerdings ist es paradoxer weise so gedacht, dass ich c++ verwende, aber nicht Objektorientiert arbeite (fragt besser nicht xD).
Daher kann ich nicht ausweichen.Was deinen Bug betrifft: CT3DImage::currentInstance ist 0...
void CT3DImage::display3DImage() { currentInstance = this; glutDisplayFunc(CT3DImage::draw); }
Ich setze es doch in der Funktion auf den this-Pointer, warum ist es dann noch 0.
Und wie kann ich es beheben wenn nicht so ^^.Gruß
-
Wo rufst du display3DImage() auf?
-
In der main() anhand eines Objektes vom Typ CT3DImage...
sprich
int main() { // ............ CT3DImage kopf; // ............ kopf.display3DImage(); // ............ }
-
Merkwürdig, check eben mal mit deinem Debugger, welcher Pointer genau 0 ist. Kann es sein, dass die Funktion schon irgendwie aufgerufen wird, bevor currentInstance einen von 0 verschiedenen Wert erhält? Check mal den Callstack am Punkt des Fehlers...
-
Mache ich sobald möglich, hab jetzt grad Vorlesung.
Wenn ich mich recht erinner sollte aber der this pointer drin gestanden haben beim aufruf der draw3DImage
-
JangoK schrieb:
Unbehandelte Ausnahme bei 0x0010bbae in GRA_Praktikum_1.exe: 0xC0000005: Zugriffsverletzung beim Schreiben an Position 0x000000a8.
Vllt kann mir ja jemand helfen
wieso sagst du uns nicht in welcher zeile der debugger stehen blieb, das waere nur fair wenn du hilfe suchst.
-
rapso schrieb:
JangoK schrieb:
Unbehandelte Ausnahme bei 0x0010bbae in GRA_Praktikum_1.exe: 0xC0000005: Zugriffsverletzung beim Schreiben an Position 0x000000a8.
Vllt kann mir ja jemand helfen
wieso sagst du uns nicht in welcher zeile der debugger stehen blieb, das waere nur fair wenn du hilfe suchst.
Tut mir leid, ich dachte, dass wäre durch die Überschrift/Fehlerbeschreibung klar geworden.
Der Debugger schmeißt den oben zitierten Fehler in folgender Zeile (Zeilennummer 30) aus:
// ------------------------------ HPP -------------- class CT3DImage { protected: vector<CTImageP2*> ctImageVec; static CT3DImage* currentInstance; static void draw(); public: CT3DImage(){} void addImage(CTImageP2* img); void draw3DImage(); void display3DImage(); ~CT3DImage(); }; // ------------------------------ CPP -------------- CT3DImage* CT3DImage::currentInstance = NULL; void CT3DImage::draw() { currentInstance->draw3DImage(); } void CT3DImage::display3DImage() { currentInstance = this; // !!!!!!!!!! HIER DEBUGGER ABBRUCH !!!!!!!!!!! glutDisplayFunc(CT3DImage::draw); // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! } void CT3DImage::draw3DImage() { //glBegin(GL_Quads); //....... //usw bla bla malen halt //glEnd(); //glFlush(); } // ------------------------------ main ------------ int main() { // ............ CT3DImage kopf; // ............ kopf.display3DImage(); // ............ return 0; }
dot schrieb:
Merkwürdig, check eben mal mit deinem Debugger, welcher Pointer genau 0 ist. Kann es sein, dass die Funktion schon irgendwie aufgerufen wird, bevor currentInstance einen von 0 verschiedenen Wert erhält? Check mal den Callstack am Punkt des Fehlers...
Zum Zeitpunkt des Aufrufs von glutDisplayFunc(CT3DImage::draw); ist die currentInstance erfolgreich zugewiesen. Also ist sie zu dem Zeitpunkt nicht 0.
Allerdings wäre das zu dem Zeitpunkt auch noch nicht so tragisch, da ja erst in der Funktion "draw" die currentInstance verwendet wird, das Programm stürzt aber schon kurz vorher ab.
Gruß
-
JangoK schrieb:
rapso schrieb:
JangoK schrieb:
Unbehandelte Ausnahme bei 0x0010bbae in GRA_Praktikum_1.exe: 0xC0000005: Zugriffsverletzung beim Schreiben an Position 0x000000a8.
Vllt kann mir ja jemand helfen
wieso sagst du uns nicht in welcher zeile der debugger stehen blieb, das waere nur fair wenn du hilfe suchst.
Tut mir leid, ich dachte, dass wäre durch die Überschrift/Fehlerbeschreibung klar geworden.
nein, leider nicht, wenn der aufruf von glutDisplayFunc sollte diesen fehler zurueck gibt, wuerde das bedeuten, dass der instruction pointer von glutDisplayFunc auf 0 zeigt. quasi dass das dll laden schiefging, aber in dem fall sollte dein program schon stehen bleiben mit der fehlermeldung dass die dll fehlt.
Der Debugger schmeißt den oben zitierten Fehler in folgender Zeile (Zeilennummer 30) aus:
der debugger schmeist keine fehler an einer zeile, der debugger faengt einen fehler und zeigt dir dann im callstack, _nachdem_ der fehler passiert ist, wo genau der auftrat. bitte schaue _nachdem_ der fehler auftrat, wo die quelle ist.
(dann siehst du vielleicht sogar ohne unsere hilfe schon was falsch ist).
-
Ok, ich probiere nochmal mein vorgehen zu erklären.
Ich startete das Zitierte Programm im Debug-Modus und setzte einen Break-Point in Zeile 30.
Bis zum Break-Point lief mein Programm fehlerfrei und machte laut debug-Informationen auch genau das, was ich erwartete.
Drückete ich dann F10 (Einzelschritt) in VS2010 und führte damit den Befehl in Zeile 30 aus, stürzte mein Programm ab und warf die beschriebene Fehlermeldung.
Demnach denke ich, dass der Funktionsaufruf von glutDisplayFunc() eindeutig als Fehlerquelle identifiziert sein sollte.
Vorher wurde mit einigen test-Funktionen das korrekte einbinden von OpenGL, glut (und damit auch die glutDisplayFunc) und OpenCV getestet und verlief fehlerfrei, daher sollte das Problem also auch nicht kommen.
Die Frage ist jetzt, warum nimmt die glutDisplayFunc meine statische Funktion nicht als übergabe-Parameter an.
Hab ich irgendwo nen denk fehler gemacht, oder könnt ihr irgendwo einen Programmierfehler finden?Alle für das Problem signifikanten stellen seht ihr im C++-Code-Block 2 posts weiter oben.
Ich hoffe ich habe mich jetzt nicht wieder fehlerhaft ausgedrückt, mir ist natürlich grob bekannt, wie ein Debugger arbeitet und das er mir keine Fehlermeldungen raus schmeißt, ich dachte nur, dass alle wüssten was gemeint ist ;).
Wer jetzt noch kleine Form-Fehler findet darf sie gern behalten
Gruß
-
JangoK schrieb:
Demnach denke ich, dass der Funktionsaufruf von glutDisplayFunc() eindeutig als Fehlerquelle identifiziert sein sollte.
GrußDeubg->Ausnahmen... Hacken bei den oberen zwei Punkten.