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
-
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.
-
an welcher stelle bleibt dein debugger mit dem speicherzugriffsfehler denn stehen?