2010-08-22 6 views
0

Y at-il un moyen en C++ de vérifier que l'effacement réussit?
J'ai deux morceaux de code qui effacent le même objet. Le premier a effacé l'objet, puis le second essaie de l'effacer mais ne trouve pas l'objet. Des idées?C++ efface les vecteurs de contrôle

for(long indexs=0; indexs < (long)Enemie1.vS2Enemie1.size(); indexs++) 
    { 
    if((vRegularShots[index].x>=Enemie1.vS2Enemie1[indexs].x && vRegularShots[index].y>=Enemie1.vS2Enemie1[indexs].y && vRegularShots[index].y<=(Enemie1.vS2Enemie1[indexs].y+17) && vRegularShots[index].x<=(Enemie1.vS2Enemie1[indexs].x+17))||(Enemie1.vS2Enemie1[indexs].x>=vRegularShots[index].x && Enemie1.vS2Enemie1[indexs].y>=vRegularShots[index].y && Enemie1.vS2Enemie1[indexs].y<=(vRegularShots[index].y+16) && Enemie1.vS2Enemie1[indexs].x<=(vRegularShots[index].x+5))) 
    { 
    Enemie1.vS2Enemie1.erase(Enemie1.vS2Enemie1.begin()+indexs); 
    vRegularShots.erase(vRegularShots.begin()+index); 
    score+=100; 
    } 
} 

vregularshots détient les coups de feu qui ont été lancées et les ennemis vS2Enemie1 cales. S'il y a eu deux tirs qui ont touché l'ennemi en même temps, alors il passera en revue les tirs et vérifiera s'il a touché des ennemis, puis effacera l'ennemi et le tir. Mais quand un autre tir a également touché l'ennemi, il essayera d'effacer l'ennemi qui a déjà été effacé.
Une idée?


MISE À JOUR

for(long indexs=0; indexs < (long)Enemie1.vS1Enemie1.size();) 
    { 
    if((vRegularShots[index].x>=Enemie1.vS1Enemie1[indexs].x && vRegularShots[index].y>=Enemie1.vS1Enemie1[indexs].y && vRegularShots[index].y<=(Enemie1.vS1Enemie1[indexs].y+17) && vRegularShots[index].x<=(Enemie1.vS1Enemie1[indexs].x+17))||(Enemie1.vS1Enemie1[indexs].x>=vRegularShots[index].x && Enemie1.vS1Enemie1[indexs].y>=vRegularShots[index].y && Enemie1.vS1Enemie1[indexs].y<=(vRegularShots[index].y+16) && Enemie1.vS1Enemie1[indexs].x<=(vRegularShots[index].x+5))) 
    { 
    Enemie1.vS1Enemie1.erase(Enemie1.vS1Enemie1.begin()+indexs); 
    vRegularShots.erase(vRegularShots.begin()+index); 
    score+=100; 
    } 
    else 
    indexs++; 
    } 
+0

Veuillez fournir un exemple de code qui illustre la question que vous avez. –

+0

Qu'est-ce qu'un 'script'? Le code C++ n'est généralement pas appelé un script, et de toute façon les vecteurs ne restent pas quand votre programme se termine ... – bdonlan

+0

je édite mon poste. – Ramilol

Répondre

0

erase ne manque pas. Si vous passez en quelque sorte les mêmes paramètres à erase une seconde fois, alors il essaiera de supprimer autre chose. Selon le scénario exact qui pourrait entraîner la suppression de quelque chose que vous n'aviez pas prévu, ou qui pourrait corrompre la mémoire et éventuellement écraser le programme si les paramètres ne sont plus valides du tout.

Cependant, dans l'extrait de code que vous montrez, je ne vois pas ce problème. Une fois qu'un ennemi est effacé du vecteur, il n'y a aucun moyen que la boucle le rencontre à nouveau pour essayer même de tester un autre tir contre lui.

Bien que vous ayez un problème différent: Lorsqu'un élément est effacé d'un vecteur, les index de tous les éléments suivants du vecteur sont décalés vers le bas de 1. (Si vous avez 4 éléments dans un vecteur, ils seront alors indexé 0,1,2,3 Si vous effacez l'élément à l'index 1, vous aurez 3 éléments avec les index 0,1,2.) La conséquence pour le code que vous avez est que lorsqu'un élément à indexs est effacé, un autre élément se déplacera pour prendre cet endroit. Mais la boucle continue juste et incrémente indexs et ainsi qu'un élément aura été ignoré.

+0

j'ai mis à jour le poste mais maintenant chaque fois que j'ai tiré quelque chose et il a frappé l'ennemi j'obtiens à nouveau l'erreur – Ramilol

+0

bien si je n'incrémente pas l'elmenet il bouclera pour toujours si le statment de si est faux – Ramilol

0

Il peut arriver que vous effacez plusieurs fois de vRegularShots en utilisant la même index sans vérifier que le index est encore dans la gamme