std :: vector超出范围

时间:2011-05-22 15:09:47

标签: c++ opengl vector standard-library

目前我正在尝试渲染我加载到矢量中的.obj模型。我试图将Vector3D对象拉出数组,但它给了我一个超出范围的错误。在数组崩溃之前它只有五个,例如当数组有12个对象时。这是渲染的代码。

glBegin(GL_TRIANGLE_STRIP);

for (int indx = 0; indx < mv3_faces.size(); ++indx)
{
    if (mb_print_once)
    {
        std::cout << "Rendering Loop....Faces at 8: " << mv3_faces.at(5).x << " Current Index: " << indx << std::endl;
        std::cout << "Rendering Loop X: " << mv3_faces.at(indx).x << " Y: " << mv3_faces.at(indx).y << " Z: " << mv3_faces.at(indx).z << std::endl;
    }

    glColor4f(1.0f, 1.0f, 0.0f, 1.0f);

    glVertex3f(mv3_vertices.at(mv3_faces.at(indx).x).x, mv3_vertices.at(mv3_faces.at(indx).y).y, mv3_vertices.at(mv3_faces.at(indx).z).z);
}

mb_print_once = false;
glEnd();

忽略mb_print_once ...用于调试目的。

3 个答案:

答案 0 :(得分:3)

你还记得.OBJ文件中的顶点索引从1开始而不是0吗?因此,在从“f”标签读取顶点索引后,必须将顶点索引减1。

另外作为一点评论,我强烈建议使用[]代替.at,尽管在这个例子中这是一个好主意,所以你得到了例外。但总的来说,范围检查开销并不值得,特别是在如此高度优化的循环中。

答案 1 :(得分:0)

我的猜测是异常来自mv3_vertices.at调用:indx应该在mv3_faces的范围内,因为该循环是如何形成的,所以可能是存储在里面的内容它不是mv3_vertices的有效索引。

如果我是你,我会介入一个调试器来找到异常的来源(或者你可以在多个语句中拆分glVertex3f(...)行并添加一些日志记录),并追踪坏数据来自哪里从

答案 2 :(得分:0)

glVertex3f(mv3_vertices.at(mv3_faces.at(indx).x).x, mv3_vertices.at(mv3_faces.at(indx).y).y, mv3_vertices.at(mv3_faces.at(indx).z).z);

我怀疑这一行。

您确定mv3_faces.at(indx).x < mv3_vertices.size()?如果不是这样,那么你将超出范围异常。查看另外两个;即mv3_faces.at(indx).ymv3_faces.at(indx).z

每当您使用std::vector::at()函数时,请确保传递给at()的索引在向量大小的范围内,否则at()将抛出out_of_range异常。如果你没有确定,那么使用try-catch块来处理这个异常以及程序的其余部分。