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 glMenu

    ClassDef.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 glMenu

    definiert. 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


  • Mod

    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


Anmelden zum Antworten