【问题标题】:std::vector out of rangestd::vector 超出范围
【发布时间】:2011-08-30 15:14:12
【问题描述】:

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

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...。

【问题讨论】:

  • 错误对应哪一行?你确定向量中有 12 个元素吗?您能否在循环前添加std::cout &lt;&lt; mv3_faces.size() &lt;&lt; std::endl; 以确认?
  • 另外,请注意,从您的代码 sn-p...中删除所有不相关的细节被认为是一种良好的礼仪...
  • 哪个向量出现超出范围的错误 - 面还是顶点?

标签: c++ opengl vector standard-library


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    如果我是你,我会使用调试器来查找异常的确切来源(或者你可以将glVertex3f(...) 行拆分为多个语句并添加一些日志记录),并跟踪不良数据的来源。

    【讨论】:

      【解决方案3】:
      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 &lt; mv3_vertices.size() 了吗?如果不是这样,那么您将超出范围异常。也看看另外两个;即mv3_faces.at(indx).ymv3_faces.at(indx).z

      无论何时使用std::vector::at() 函数,请确保传递给at() 的索引在向量大小的范围内,否则at() 将抛出out_of_range 异常。如果您不确定,请使用 try-catch 块来处理此异常和程序流程的其余部分。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-12-13
        • 2011-07-17
        • 1970-01-01
        • 2019-10-27
        • 2011-04-28
        • 2013-04-04
        • 1970-01-01
        • 2023-02-01
        相关资源
        最近更新 更多