簡體   English   中英

std :: vector超出范圍

[英]std::vector out of range

目前,我正在嘗試渲染加載到矢量中的.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...。

您是否還記得.OBJ文件中的頂點索引從1開始而不是0? 因此,從“ f”標簽讀取頂點索引后,必須將其遞減1。

另外,作為一點評論,我強烈建議使用[]代替.at ,盡管在此示例中,這是一個好主意,所以您遇到了例外。 但是通常來說,范圍檢查開銷是不值得的,尤其是在如此高度優化的循環中。

我的猜測是,除了來自mv3_vertices.at電話: indx應該在范圍mv3_faces ,因為這個循環是怎么制成的,所以可能它就是被存儲在它里面,它不是一個有效的指數mv3_vertices

如果您是我,我將與調試器一起介入以找出異常的確切來源(或者您可以在多個語句中分割glVertex3f(...)行,並添加一些日志記錄),並跟蹤不良數據從何而來。

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塊處理此異常以及程序的其余部分。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM