私はベクター上でループすることに問題があり、別のベクターから値を削除すると、プログラムがクラッシュすることがあります。私はどの要素を削除すべきかを追跡するintのベクトルを持っています。forループのクラッシュでベクターから削除しますか?
std::vector<int> trEn;
そこで私は、このベクトルをループ:ループはこのようになります
struct enemyStruct {
float x, y, health, mhealth, speed, turnspeed;
double angle, tangle;
};
std::vector<enemyStruct> enemies;
:
for (unsigned int i = 0; i < bullets.size(); i++) {
for (unsigned int j = 0; j < enemies.size(); j++) {
if (bullets[i].x > enemies[j].x-10 && bullets[i].x < enemies[j].x+10 && bullets[i].y > enemies[j].y-10 && bullets[i].y < enemies[j].y+10)
{
enemies[j].health-=bullets[i].dmg;
if(enemies[j].health<=0){trEn.push_back(j);break;}
}
}
}
弾丸ベクトルが敵ベクトルに似てちょうど別のベクトルであるが、弾丸とその中に。それは問題ではないようです。このコードはすべてうまくいきますが、実際には敵のベクトルのアイテムを削除するときにプログラムがクラッシュすることがあります。それは後ろから前に行くように
std::reverse(trEn.begin(), trEn.end());
for (unsigned int g = 0; g < trEn.size(); g++) {
unsigned int atmp = trEn.at(g);
if(atmp<=enemies.size()&&atmp>=0)enemies.erase(enemies.begin()+atmp,enemies.begin()+atmp+1);
} trEn.clear();
まず私はint
年代のベクトルを逆に。もし私がdid'ntすれば、trEn[0]
の後のすべての値は無効になります。 これは私にクラッシュを与えるループですが、ときどきのみです。私がしようとしているのは、トップダウンシューティングゲームです。同時に多くのものを取り除くと、ちょうどクラッシュするようです。これで私を助けてください!
不明な点があるのか、不足していることがあるかどうかを確認してください。
実際には、それはおそらくアトムが> Enimiesのサイズより大きいとは限りません。 –
残りのコードには多すぎます(図示されていません)。しかし、この質問の文脈のために、私はOPにおそらくそれが念頭に置かれていることに同意します。 – gimpf
私はアサーションが、プログラムがエラーとしてキャッチしなければならないと思うなら、私は正しいでしょうか?私はそのような初心者です... – Mariamario