Jump to content

  • Log In with Google      Sign In   
  • Create Account

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.

  • You cannot reply to this topic
3 replies to this topic

#1 chris2307   Members   -  Reputation: 163

Like
0Likes
Like

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

Sponsor:

#2 NumberXaero   Prime Members   -  Reputation: 1460

Like
1Likes
Like

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.


#3 chris2307   Members   -  Reputation: 163

Like
0Likes
Like

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 :)

#4 stillLearning()   Members   -  Reputation: 212

Like
0Likes
Like

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.
This might help you figure out Code 3 problems later on!

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



PARTNERS