View more

View more

View more

Image of the Day Submit

IOTD | Top Screenshots

The latest, straight to your Inbox.

Subscribe to GameDev.net Direct to receive the latest updates and exclusive content.

Having trouble deleting vectors

Old topic!

Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.

3 replies to this topic

#1chris2307  Members

Posted 11 October 2012 - 01:33 PM

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.


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();
}
}
}


Any help would be greatly appreciated. Thanks

#2NumberXaero  Prime Members

Posted 11 October 2012 - 01:46 PM

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.
   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
}


Edited by NumberXaero, 11 October 2012 - 01:54 PM.

#3chris2307  Members

Posted 11 October 2012 - 02:10 PM

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

#4stillLearning()  Members

Posted 13 October 2012 - 07:19 PM

Just have to point this out: Code 3 means SIGSEGV. SIGSEGVs are Segmentation Faults. They usually occurs when:
• 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 copied from wiki)

Edited by Kuxe, 13 October 2012 - 07:26 PM.

If you don't understand the stuff written here, please sharpen your C++ skills.

Old topic!

Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.