这是导致错误的行
vector<transform>::iterator transformIter;
for (transformIter = (*objIter)->transforms.begin(); transformIter != (*objIter)->transforms.end(); objIter++) {
handleTransform((*transformIter));
}
它发生在循环的第二次迭代中,无论向量中有多少个transofrms。
obj结构如下所示:
struct obj {
vector<glm::vec4> vertices;
vector<int> elements;
vector<object> objects;
vector<transform> transforms;
};
并且函数handleTransform是:
void handleTransform(transform currentTransform) {
if (currentTransform.type == 'r') {
glRotatef(currentTransform.coordinates.x, 1.0f, 0.0f, 0.0f);
glRotatef(currentTransform.coordinates.y, 0.0f, 1.0f, 0.0f);
glRotatef(currentTransform.coordinates.z, 0.0f, 0.0f, 1.0f);
}
if (currentTransform.type == 's') {
glScalef(currentTransform.coordinates.x, currentTransform.coordinates.y, currentTransform.coordinates.z);
}
if (currentTransform.type == 't') {
glTranslatef(currentTransform.coordinates.x, currentTransform.coordinates.y, currentTransform.coordinates.z);
}
}
迭代obj中的其他向量不会导致任何向量问题,所以我必须想象它与handleTransform函数有关,但我无法弄明白。
答案 0 :(得分:1)
您错误地增加了objIter
,而不是transformIter
:
for (transformIter = (*objIter)->transforms.begin();
transformIter != (*objIter)->transforms.end();
objIter++) // ??
应该是:
for (transformIter = (*objIter)->transforms.begin();
transformIter != (*objIter)->transforms.end();
++transformIter)
为了避免这样的错误,请使用std::for_each
,或者如果使用C ++ 11,则使用基于范围的for
循环:
http://en.cppreference.com/w/cpp/language/range-for
使用这些选项中的任何一个,您就不需要声明迭代器,将错误迭代到下一个项目,或者如果不是那些问题,则执行后增量而不是更快的迭代器预增量(作为原始代码正在做)。
答案 1 :(得分:1)
将objIter++
替换为++transformIter
。