Pufferüberlauf in OpenGl
-
Schönen guten Tag,
Ich programmiere z.Z. ein wenig in OpenGL und wollte jetzt zwei Klassen schreiben, eine für Edits und eine für Buttons, damit es möglich wird mit dem Programm zu interagieren. jetzt hab ich diese klassen in einem Header und der dazugehörigen cpp geschrieben. Wenn ich den Header in mein Projekt einbinde und es dann ausführe kommt eine Fehlermeldung:
"Unbehandelte Ausnahme bei 0x10009e12 in 3d.exe: 0xC0000005: Zugriffsverletzung beim Lesen an Position 0x0000002c."
Wenn ich verhindere, dass die Funktion in der der Fehler auftritt ausgeführt wird
Kommt ein Fehler an anderer Stelle da heißt es dann:
"Durch einen Pufferüberlauf in 3d.exe wurde der interne Programmzustand beschädigt"[...]
hatt irgendjemand ne Idee woran das liegen könnte?
Ich vermute es liegt daran,
dass ich in dem Header in dem die klassen deklariert(definiert?) sind glut.h eingebunden habe aber OpenGL nicht initialiesiert habe, da dass ja im hauptprogramm passiert.PS.: Ich weiß jetzt nicht was alles wichtig ist um das problem zu lösen und da das ziemlich viel code ist habe ich jetzt erstmal keinen code gepostet wenn irgendjemand teile meines codes sehen will werde ich das natürlich nachhohlen.
-
Interessant wären die Code-Teile, bei denen du Speicher reservierst, kopierst, etc.
Einen Pufferüberlauf bekommst du hin, wenn du zu große Daten in zu kleine Speicherbereiche steckst.Beim Inkludieren von Dateien sollten keine Programmfehler entstehen.
-
welchen speicher? den für die klassen? ich kann dir ja kurz den aufbau meines projekts schildern:
main.cpp:
initialisierung für OpenGL (Hauptsächlich von NeHe)
und anlegen eines objects vom typ glMenuClassDef.h/.cpp
für speicherverwaltung von 3D Objekten also 3DVectoren,Kollisionsüberprüfung allsowas wird zu diesem Zeitpunkt noch nicht gebaraucht es werden auch keine Befehlte aus diesen Dateien aufgefufen
glAPI.h
hier sind die klassen:
glEdit,
glButton,
und glMenudefiniert. glMenu enthält verwaltet imprinzip die Buttons und Edits im hauptprogramm muss man sich dann nurnoch um glMenu kümmern (mit den Messages der WinProc versorgen, initialisieren...)
glAPI.cpp
müsste klar sein denke ich
MFG
Luis
-
wo genau bleibt dein debugger stehen?
-
In der Prozedur in der er das Programm Mausklicks verarbeitet bei der Funktin glutSwapBuffers();
GLvoid glMenu::OnClick(int x, int y) { GLuint buff[64] = {0}; GLint hits; glSelectBuffer(64, buff); glRenderMode(GL_SELECT); glInitNames(); glPushName(0); glMatrixMode(GL_PROJECTION); glPushMatrix(); glLoadIdentity(); gluPickMatrix(x, 480-y, 1.0, 1.0, Parview); gluPerspective(60, 1.0, 0.0001, 1000.0); glMatrixMode(GL_MODELVIEW); glutSwapBuffers(); //hier for(int n=0;n<int(Edits.size());n++) { glLoadName(GLuint(n)); Edits[n].draw(); } for(int n=0;n<int(Buttons.size());n++) { glLoadName(GLuint(n+Edits.size())); Buttons[n].draw(); } glMatrixMode(GL_PROJECTION); glPopMatrix(); hits = glRenderMode(GL_RENDER); glMatrixMode(GL_MODELVIEW); if(buff[3]>Edits.size()) { ActiveButton=buff[3]-Edits.size(); ActiveKind=1; Buttons[buff[3]-Edits.size()].clicked=true; } else { ActiveEdit=buff[3]; ActiveKind=0; Edits[buff[3]].cursorpos=strlen(Edits[buff[3]].text); } }
MFG
Luis
-
könnte es daran liegen, dass ich OpenGL Befehle in der glAPI.cpp aufrufe, die sich auf das OGL Fenster beziehen obwohl ich das Fenster und alles ja in der main.cpp verwaltet wird? Wenn das eine Ursache sein könnte weiß jemand eine möglichkeit das problem zu beheben
MFG
Luis
-
ich habs gelöst!!
ich weiß nicht woran genau es gelegen hat ich hab einfach nur glutSwapBuffers()
gegen SwapBuffers(HDC) getauscht.mfg Luis