#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()
?