С ++ программа удаления векторных сбоев

Моя программа создает снаряды, которые движутся вперед, если они выходят за определенные границы, они должны быть удалены из вектора, в котором они хранятся. Вектор хранит xcord, ycord, zcord и их соответствующие направления.

int size = bullet.size();
for(int i = 0; i < size; i+=6)
{
float xc = bullet[i];
float yc = bullet[i+1];
float zc = bullet[i+2];
float xd = bullet[i+3];
float yd = bullet[i+4];
float zd = bullet[i+5];
if(xc > 100 || yc > 10 || zc > 100 || xc < -100 || yc < -10 || zc < -100)
{
bullet.erase(bullet.begin()+i, bullet.begin()+i+5);
size=size-6;
i = i-6;
}
else
{
glEnable(GL_TEXTURE_2D);
glBindTexture ( GL_TEXTURE_2D, texture_id[3] );
glPushMatrix();
glTranslatef( xc+(xd/2), yc+(yd/2), zc+(zd/2));   //x y z coord of sphere
glRotatef( 0,0,1,0);
glRotatef( -80,1,0,0);
glRotatef( 0,0,0,1);
glScalef( 0.10f, 0.10f, 0.10f);
gluQuadricTexture(quadric,1);
gluSphere(quadric,10.0,72,72);
glPopMatrix();
glDisable(GL_TEXTURE_2D);
bullet[i] = xc+xd;
bullet[i+1] = yc+yd;
bullet[i+2] = zc+zd;
}
}

Но когда «пуля» выходит за пределы моей программы, кажется, происходит сбой. Есть идеи?


Хорошо меняется

bullet.erase(bullet.begin()+i, bullet.begin()+i+5);

в

bullet.erase(bullet.begin()+i, bullet.begin()+i+6);

похоже исправил


Для тех, кто заинтересован

      bullet.push_back(xpos);
bullet.push_back(0.0f);
bullet.push_back(zpos);
bullet.push_back(nxpos);
bullet.push_back(nypos);
bullet.push_back(nzpos);

происходит всякий раз, когда щелкают мышью

0

Решение

У тебя есть

i < size

как ваше состояние, и доступ к элементам

bullet[i] .... bullet[i+5]

Видишь что-то там не так? Что происходит, когда i достигает size-1, Вы получите доступ bullet[size + 4], право?

5

Другие решения

http://www.cplusplus.com/reference/vector/vector/erase/

Итераторы, задающие диапазон в векторе], которые будут удалены:
[первый Последний). то есть диапазон включает в себя все элементы между первым
и последний, включая элемент, указанный первым но не тот
указал последний
.

Проблема в том, что вы удаляете только 5 элементов вместо 6.

3

По вопросам рекламы [email protected]