Speicherzugriffsfehler



  • Hallo,
    derzeit versuche ich mich an einen .obj Loader (mittels OpenGL) den ich nach einem Tutorial gebastelt habe, jedoch erhalte ich bei der Ausführung einen "Speicherzugriffsfehler (Speicherabzug geschrieben)". Diese Fehlerart ist mir bekannt, da ich schon häufig mit ihnen in anderen Projekten zu tun hatte, jedoch weiß ich diesmal nicht woran es liegt. Hier die drei relevanten Datein, solltet ihr noch andere Fehler finden (auch stilistisch), so nennt mir sie bitte.

    main.cpp :

    #include <GL/glew.h>
    #include <GL/glut.h>
    
    // My Import
    #include "hud.h"
    #include "objloader.h"
    
    void changeSize(int w, int h) {
    
    	// Prevent a divide by zero, when window is too short
    	// (you cant make a window of zero width).
    	if (h == 0)
    		h = 1;
    
    	float ratio =  w * 1.0 / h;
    
    	// Use the Projection Matrix
    	glMatrixMode(GL_PROJECTION);
    
    	// Reset Matrix
    	glLoadIdentity();
    
    	// Set the viewport to be the entire window
    	glViewport(0, 0, w, h);
    
    	// Set the correct perspective.
    	gluPerspective(0,ratio,1,100);
    
    	// Get Back to the Modelview
    	glMatrixMode(GL_MODELVIEW);
    }
    
    void renderScene(void) {
    
    	vector<glm::vec4> suzanne_vertices;
      	vector<glm::vec3> suzanne_normals;
      	vector<GLushort> suzanne_elements;
    	GLint attribute_v_coord = -1;
        GLint attribute_v_normal = -1;
    	GLuint vbo_mesh_vertices, vbo_mesh_normals, ibo_mesh_elements;
    
    	objloader objloader;
    	objloader.inputFileStream("suzanne.obj", suzanne_vertices, suzanne_normals, suzanne_elements);
    
    	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    
    	glEnableVertexAttribArray(attribute_v_coord);
    
    	glBindBuffer(GL_ARRAY_BUFFER, vbo_mesh_vertices);
    
    	glVertexAttribPointer(attribute_v_coord, 4, GL_FLOAT, GL_FALSE, 0, 0);
    
    	glBindBuffer(GL_ARRAY_BUFFER, vbo_mesh_normals);
    
    	glVertexAttribPointer(attribute_v_normal, 3, GL_FLOAT, GL_FALSE, 0, 0);
    
    	glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ibo_mesh_elements);
    
    	int size;
    	glGetBufferParameteriv(GL_ELEMENT_ARRAY_BUFFER, GL_BUFFER_SIZE, &size);
    	glDrawElements(GL_TRIANGLES, size/sizeof(GLushort), GL_UNSIGNED_SHORT, 0);
    
    	glutSwapBuffers();
    
    }
    
    int main(int argc, char **argv) {
    
    	// init GLUT and create window
    	glutInit(&argc, argv);
    	glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGBA);
    	glutInitWindowPosition(0, 0);
    	glutInitWindowSize(500, 500);
    	glutCreateWindow("Test");
    
    	// register callbacks
    	glutDisplayFunc(renderScene);
    	glutReshapeFunc(changeSize);
    
    	// enter GLUT event processing loop
    	glutMainLoop();
    
    	return 1;
    }
    

    objloader.h :

    #include <iostream>
    #include <fstream>
    #include <vector>
    #include <glm/glm.hpp>
    #include <GL/glut.h>
    #include <sstream>
    
    using namespace std;
    
    class objloader {
    
    private :
    	string line;
    	GLushort a, b, c, ia, ib, ic;
    	glm::vec4 vec;
    	glm::vec3 normal;
    
    public :
    	void inputFileStream(const char* filename, vector<glm::vec4> &vertices, vector<glm::vec3> &normals, vector<GLushort> &elements);
    
    };
    

    objloader.cpp :

    #include "objloader.h"
    
    void objloader::inputFileStream(const char* filename, vector<glm::vec4> &vertices, vector<glm::vec3> &normals, vector<GLushort> &elements) {
    
    	ifstream objectFile(filename, ios::in);
    	if(!objectFile) {
    		cout << "Error : Can not open the file ( "<< filename << " )" << endl;
    	exit(1);
    	}
    
    	while(getline(objectFile, line)) {
    		if(line.substr(0,2) == "v ") {
    			istringstream stringstream(line.substr(2));
    			stringstream >> vec.x;
    			stringstream >> vec.y;
    			stringstream >> vec.z;
    			vec.w = 1.0f;
    			vertices.push_back(vec);
    		} else if(line.substr(0,2) == "f ") {
    			istringstream stringstream(line.substr(2));
    			stringstream >> a;
    			stringstream >> b;
    			stringstream >> c;
    			a--; b--; c--;
    			elements.push_back(a);
    			elements.push_back(b);
    			elements.push_back(c);
    		} else if(line[0] == '#') {
    			// Nothing to do
    		} else {
    			// Nothing to do
    		}
    	}
    
    	objectFile.close();
    
    	normals.resize(vertices.size(), glm::vec3(0.0, 0.0, 0.0));
      	for (int i = 0; i < elements.size(); i+=3) {
        		ia = elements[i];
        		ib = elements[i+1];
        		ic = elements[i+2];
        		normal = glm::normalize(glm::cross(
          			glm::vec3(vertices[ib]) - glm::vec3(vertices[ia]),
          			glm::vec3(vertices[ic]) - glm::vec3(vertices[ia])));
        		normals[ia] = normals[ib] = normals[ic] = normal;
    	}
    
    }
    
    Vielen Dank fürs helfen,
    Mfg
    

  • Mod

    Ist das richtig, wie du die Buffer verwendest? Musst du die nicht zuerst irgendwie erzeugen? Ich kenne mich mit OpenGL nicht so gut aus, aber ich habe den Code einfach durch einen Compiler gejagt und deine glBindBuffer-Zeilen sind es, wo ich gewarnt wurde, eben weil die Objekte dort uninitialisiert benutzt werden. Dein Compiler könnte dich sicherlich auch vor solchen Fehlern warnen, wenn du bloß Warnungen einschalten würdest.



  • Dieser Thread wurde von Moderator/in SeppJ aus dem Forum C++ (alle ISO-Standards) in das Forum Spiele-/Grafikprogrammierung verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.


  • Mod

    an welcher stelle bleibt dein debugger mit dem speicherzugriffsfehler denn stehen?


Anmelden zum Antworten