Необработанное исключение на входе 0x1000bbae OCTREE.exe : 0xC0000005: место записи с нарушением доступа 0x000000a8

#c #visual-studio-2008

#c #visual-studio-2008

Вопрос:

Я получаю вышеупомянутую ошибку во время выполнения в следующем коде в строке:

 glutMainLoop(); 
  

Почему?

 #include <stdio.h>
#include <vector>
#include <iostream>
#include <fstream>
#include <sstream>
#include <string>
#include <cassert>
#include <math.h>
#include <gl/glut.h>
#include <stdlib.h>

class Vertex {

public: float X;
        float Y;
        float Z;

public: Vertex (float first, float second, float third){

            X=first;
            Y=second;
            Z=third;

        }

};


using namespace std;

vector <Vertex> vertexCoordinates;
vector <vector<int>> faces;
vector <vector<float>> faceNormals;
vector <vector<float>> faceCenters;

void loadOff(string inputFileName) {


    int vertexCount; int faceCount; int edgeCount;

    ifstream inputFileStream;

    inputFileStream.open(inputFileName.data());

    assert(inputFileStream.is_open());

    string actualLine;

    inputFileStream>>vertexCount;
    inputFileStream>>faceCount;
    inputFileStream>>edgeCount;


    for (int loadVertexIndex=0; loadVertexIndex<vertexCount; loadVertexIndex  ){


        float X;
        float Y;
        float Z;

        inputFileStream>>(float)X;
        inputFileStream>>(float)Y;
        inputFileStream>>(float)Z;

        vertexCoordinates.push_back(Vertex(X,Y,Z));

        if(inputFileStream.eof())break;

    }

    for (int faceIndex=0; faceIndex<=faceCount; faceIndex  ){ //<= faceCount?

      string line;

      getline(inputFileStream, line);

      istringstream actualLineStream(line);


      std::vector<int> face((std::istream_iterator<int>(actualLineStream)),
      std::istream_iterator<int>());


      faces.push_back(face);


    }//end for faceCount

}

void display(void) {

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glMatrixMode(GL_MODELVIEW);



    glutSwapBuffers();

    glutPostRedisplay();



}


void init(){

    //loadOff("spider.off");

    //BLACK BACKGROUND
    glClearColor(0.0f, 0.0f, 0.0f, 1.0f);

    glEnable(GL_DEPTH_TEST);

    glPolygonMode(GL_BACK, GL_LINE);
    glPolygonMode(GL_FRONT, GL_LINE);

}



void reshape(int w, int h) {


    glViewport (0,0,(GLsizei) w, (GLsizei) h);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluLookAt(0.0f, 0.0f, 1.0f, 0.0f, 0.0f, -1.0f, 0.0f, 1.0f, 0.0f);
    glMatrixMode(GL_MODELVIEW);

}

void keyboard (unsigned char key, int x, int y){

}

void specialKeys(int key, int x, int y) {

}



int main(int argc, char *argv[]){

    glutInit(amp;argc, argv);
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA | GLUT_DEPTH );
    glutInitWindowSize(800,600);

    init();
    glutDisplayFunc(display);


    glutMainLoop();
    return 0;
}
  

Комментарии:

1. можете ли вы указать, какая строка вызывает исключение?

2. отладьте его построчно и сообщите, что должно произойти последним перед исключением

3. где вы вызываете метод LoadOff?

4. @omgzor: Если бы вы включили такого рода информацию в свой вопрос, то, вероятно, не получили бы отрицательных отзывов…

5. Функции перенасыщения возвращают код состояния, который указывает, столкнулись ли они с состоянием ошибки. Вы не проверяете ни одно из них. Отсутствие какой-либо идеи, почему ваша программа не запускается, является неизбежным следствием.

Ответ №1:

Вы получаете исключение при попытке записи в 0x000000a8. Происходит то, что где-то ваш код или OpenGL получает нулевой указатель, а не действительный указатель. Рассматриваемый код пытается что-то обновить со смещением 168 (0xa8) от этого указателя.

Ответ №2:

Я не использовал GLUT в течение 7 лет, поэтому отнеситесь к моему ответу со всей серьезностью. При этом ваша init() функция вызывает у меня некоторое беспокойство. Я считаю, что когда вы пишете программы с перенасыщением, вы должны выдавать команды OpenGL только в функциях обратного вызова с перенасыщением. Я не уверен, что при выполнении вашей init() функции существует активный контекст OpenGL. Произойдет ли сбой программы, если вы удалите вызов init() ?