Sign in to follow this  

Having trouble deleting vectors

This topic is 1921 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

If you intended to correct an error in the post then please contact us.

Recommended Posts

Hi all,

After thinking I was beginning to get the hang of everything, I have come up stuck again. I have hit this problem before where I iterate around a vector and after some collision detection decide whether to delete it or not.

When one of the bullets hit the boss, the game crashes and exits with a code 3.

What confuses me is that this method works well for other places in the game where I need to delete the bullets so where am I going wrong? I know that I am dereferencing incorrectly but just cannot see why here.

[code]

for (std::vector<boss>::iterator bossIT = boss1.begin(); bossIT != boss1.end(); bossIT++)
{
(*bossIT).move(spaceShip1.xPosition(), spaceShip1.yPosition()); // Moves the boss
for (std::vector<bullet>::iterator bulletIT = aBullet.begin(); bulletIT != aBullet.end(); bulletIT++) // Loops around each bullet
{
if((*bossIT).xPosition() + 32 >= (*bulletIT).xPosition() && (*bossIT).xPosition() <= (*bulletIT).xPosition() + 10 && // Detects Collision
(*bossIT).yPosition() + 32 >= (*bulletIT).yPosition() && (*bossIT).yPosition() <= (*bulletIT).yPosition() + 10)
{
aBullet.erase(aBullet.begin()+bulletIterator); // Crashes here with code 3
(*bossIT).hit();
}
}
}
[/code]

Any help would be greatly appreciated. Thanks

Share this post


Link to post
Share on other sites
Where is "bulletIterator" defined? I dont see it, I see "bulletIT", is bulletIterator a typo? or another variable that shouldnt be there?
I would call the line "(*bossIT).hit();" before doing any list clean up just so that the logic of your if statement collision check is done before things start getting deleted and moved around. erase removes the current element and returns an iterator to the next, which is end() if you erase the last element.
[CODE]
for (std::vector<bullet>::iterator bulletIT = aBullet.begin(); bulletIT != aBullet.end(); ) // Loops around each bullet
{
if((*bossIT).xPosition() + 32 >= (*bulletIT).xPosition() && (*bossIT).xPosition() <= (*bulletIT).xPosition() + 10 && // Detects Collision
(*bossIT).yPosition() + 32 >= (*bulletIT).yPosition() && (*bossIT).yPosition() <= (*bulletIT).yPosition() + 10)
{
(*bossIT).hit();
bulletIT = aBullet.erase(bulletIT); // update iterator with next if collision
}
else
++ bulletIT; // no collision go to next bullet
}
[/CODE] Edited by NumberXaero

Share this post


Link to post
Share on other sites
Yes, you are quite correct... I have made a typo :-(

Thanks for pointing it out and also for the other suggestions. It now works for me :)

Share this post


Link to post
Share on other sites
Just have to point this out: Code 3 means SIGSEGV. SIGSEGVs are Segmentation Faults. They usually occurs when:[list]
[*]dereferencing NULL pointers,
[*]attempting to access memory the program does not have rights to (such as kernel structures in process context)
[*]attempting to access a nonexistent memory address (outside process's address space)
[*]attempting to write read-only memory (such as code segment),
[*]a buffer overflow,
[*]using uninitialized pointers.
[/list]
This might help you figure out Code 3 problems later on!

(list copied from [url="http://en.wikipedia.org/wiki/Segmentation_fault"]wiki[/url]) Edited by Kuxe

Share this post


Link to post
Share on other sites
Sign in to follow this