std :: вектор вне диапазона - PullRequest
1 голос
/ 22 мая 2011

В настоящее время я пытаюсь отобразить модель .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 ]

3 голосов
/ 22 мая 2011

Помните ли вы, что индексы вершин в файлах .OBJ начинаются с 1, а не с 0?Таким образом, вы должны уменьшить индексы вершин на 1 после чтения их из тега "f".

А также в качестве небольшого комментария, я настоятельно рекомендую использовать [] вместо .at, хотя в этомНапример, это была хорошая идея, поэтому вы получили исключение.Но в целом накладные расходы на проверку диапазона не стоят того, особенно в такой высоко оптимизируемой петле.

0 голосов
/ 22 мая 2011
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).y и mv3_faces.at(indx).z.

Когда вы используете функцию std::vector::at(), убедитесь, что индекс, который вы передаете at(), находится в пределах диапазона отразмер вектора, в противном случае at() вызовет исключение out_of_range.Если вы не уверены в этом, используйте блок try-catch для обработки этого исключения и остальной части потока программы.

0 голосов
/ 22 мая 2011

Я предполагаю, что исключение происходит из вызова mv3_vertices.at: indx должно быть в диапазоне для mv3_faces, из-за того, как сделан этот цикл, поэтому, вероятно, это то, что хранится внутри него, что оно недопустимо индекс для mv3_vertices.

На вашем месте я бы зашел с отладчиком, чтобы точно определить, откуда исходит исключение (или вы можете разбить строку glVertex3f(...) на несколько операторов и добавить некоторое ведение журнала), и проследить, откуда поступают неверные данные.

...