Я делаю программу по упрощению сетки, и я столкнулся с проблемой. Поскольку лица и вершины, которые я читаю, имеют огромное количество, когда я пытаюсь выполнить некоторую обработку на таких лицах, как (нахождение нормали каждого лица, отслеживание краев), мои циклы могут достигать нескольких тысяч или даже десяти тысяч,
Однако, когда я пытаюсь выполнить отладку, программа выйдет из строя и сообщит мне, что
vector subscript is out of range
Ошибка возникает здесь во внутреннем файле <vector>
:
#if _ITERATOR_DEBUG_LEVEL == 2
if (size() <= _Pos)
{ // report error
_DEBUG_ERROR("vector subscript out of range");
_SCL_SECURE_OUT_OF_RANGE;
}
#elif _ITERATOR_DEBUG_LEVEL == 1
_SCL_SECURE_VALIDATE_RANGE(_Pos < size())
Поэтому мне интересно, есть ли способ увеличить вектор MVS 2010? Извините, если мой вопрос звучит глупо.
ok: ниже мой код: я нахожу нормальный для каждого лица
Face *f;
Point P1;
Point P2;
Point P3;
Point normal;
for(int i=0; i<F.size(); i++)
{
f = F[i];
P1 = V[F[i]->a]->coord;
P2 = V[F[i]->b]->coord;
P3 = V[F[i]->c]->coord;
float V21a = P2.x - P1.x;
float V21b = P2.y - P1.y;
float V21c = P2.z - P1.z;
float V31a = P3.x - P1.x;
float V31b = P3.y - P1.y;
float V31c = P3.z - P1.z;
normal.x = V21b*V31c - V21c*V31b;
normal.y = V21c*V31a - V21a*V31c;
normal.z = V21a*V31b - V21b*V31a;
float normalize = sqrt(pow(normal.x,2) + pow(normal.y,2) + pow(normal.z,2));
normal.x = normal.x / normalize;
normal.y = normal.y / normalize;
normal.z = normal.z / normalize;
float d = -1 * (normal.x*P2.x + normal.y*P2.y + normal.z*P2.z);
f->plane[0] = normal.x;
f->plane[1] = normal.y;
f->plane[2] = normal.z;
f->plane[3] = d;
}
F is a list of faces
V is a list of vertex
Программа работает абсолютно нормально, если F.size() меньше 500, но сбой при превышении этого.
Насколько я вижу, проблема заключается не в размере F.
Я бы посмотрел:
P1 = V[F[i]->a]->coord;
P2 = V[F[i]->b]->coord;
P3 = V[F[i]->c]->coord;
На данный момент вы, вероятно, пытаетесь получить доступ к индексу внутри V, которого не существует. Взгляд на столбец в то время, когда возникает ошибка, должен показать, откуда произошло недопустимое значение.
Вы также можете добавить некоторые утверждения в этих строках, чтобы позволить отладчику дать вам ошибку, как только значение выходит за рамки.