Jump to content

  • Log In with Google      Sign In   
  • Create Account


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
1 reply to this topic

#1 Lewis De Angelo   Members   -  Reputation: 108

Like
0Likes
Like

Posted 15 December 2012 - 09:29 PM

Hey guys, I've been having a little trouble with vectors recently. I've used this same code on another file, and it complies flawlessly. However, here it does compile but the program ends immediately.

#include"SDL/SDL.h"
#include"SDL/SDL_image.h"
#include<cstdlib>
#include<ctime>
#include<sstream>
#include"string"
#include<vector>
//Applies a sprite to the screen
int apply_sprite( SDL_Surface* src, SDL_Rect* offsets = NULL, SDL_Rect* clip = NULL )
{
	 //Directly applies the sprite to the screen and check for errors
	 if( SDL_BlitSurface( src, clip, SDL_GetVideoSurface(), offsets ) == -1 )
	 {
		 return 0;
	 }
	
	 return 1;
}
//Opens a sprite/spritesheet and returns it
SDL_Surface* open_sprite( std::string path )
{
			 //Opens the image and stores it in a temp surface
			 SDL_Surface* temp = IMG_Load( path.c_str() );
			
			 //If the image didn't load
			  if( temp == NULL )
			  {
				  return NULL;
			  }
			  
			   //Optimises the temp surface
			   SDL_Surface* optimized = SDL_DisplayFormat( temp );
			  
			   //Map the color key
			   Uint32 colorkey = SDL_MapRGB( optimized->format, 255, 0, 255 );
	
			   //Set all pixels of color R 0, G 0xFF, B 0xFF to be transparent
			   SDL_SetColorKey( optimized, SDL_SRCCOLORKEY, colorkey );
	
			  
			   //Free's the memory consumed by temp
			   SDL_FreeSurface( temp );
			  
			   return optimized;
		  
}

class present
{
	  private:
	
	  int x, y, w, h, yVel;
	
	  SDL_Rect offsets;
	
	  SDL_Surface* sprite;
	
	  public:
	
	  present();
	
	  ~present();
	
	  void move();
	
	  void show();
	
};
present::~present()
{
				   SDL_FreeSurface( sprite );
}
present::present():
w( 51 ),
h( 48 ),
yVel( 1 ),
x( rand() % SDL_GetVideoSurface()->clip_rect.w ),
y( 48 )

{
		  
		   std::stringstream temp;
		   temp << "Pres" << (rand() % 5) + 1 << ".bmp";
		  
		   sprite = open_sprite( temp.str().c_str() );
}

void present::move()
{
	  y += yVel;
	
	  if( (y + h) >= 589 )
	  {
		  y += -yVel;
	  }
}

void present::show()
{
	  offsets.x = x;
	  offsets.y = y;
	
	  apply_sprite( sprite, &amp;amp;offsets );
}


int main( int argv, char* argc[] )
{
	 srand( static_cast<unsigned int>(time(0)));
	
	 SDL_Init( SDL_INIT_EVERYTHING );  
	
	 SDL_Surface* screen = SDL_SetVideoMode( 500, 657, 32, SDL_SWSURFACE );
	
	 if( screen == NULL )
	 {
		 return 1;
	 }
	
	 SDL_Surface* backround = open_sprite( "Backround.bmp" );
	
	 if( backround == NULL )
	 {
		 return 1;
	 }
	
	 SDL_WM_SetCaption( "Merry Christmas!", NULL );
	
	 bool quit = false;
	
	 int maximum_presents = 2;
	
	 std::vector<present> presents;
	 std::vector<present>::iterator it;

// Begin OP's bolded code
	 for( int i = 0; i < maximum_presents; i++ )
	 {
		 present temp;
		 presents.push_back( temp );
	 }
// End OP's bolded code

	 SDL_Event event;
	
	 int time = SDL_GetTicks();
	
	 while( !quit )
	 {  
	

		 while( SDL_PollEvent(&amp;amp;event) )
		 {
				if( event.type == SDL_QUIT )
				{
					quit = true;
				}
		 }

		 SDL_FillRect( screen, &amp;amp;screen->clip_rect, SDL_MapRGB( screen->format, 255, 255, 255) );
		
		 if( !apply_sprite( backround ) )
		 {
			 return 1;
		 }
		
			  
		 for( it = presents.begin(); it != presents.end(); it++ )
		 {
			  it->move();
		 }
		
		
		 for( it = presents.begin(); it != presents.end(); it++ )
		 {
			it->show();
		 }	  
		
		 SDL_Flip( screen );		
	 }
	
	 SDL_Quit();
	 SDL_FreeSurface( backround );
	
	 return 0;
}
I've highlighted the problematic lines.
If you could help, I'd be grateful.

Edited by JTippetts, 15 December 2012 - 09:59 PM.
Code tags


Sponsor:

#2 Cornstalks   Crossbones+   -  Reputation: 6974

Like
0Likes
Like

Posted 15 December 2012 - 09:42 PM

Please use [ code ][ /code ] (without the spaces) tags when posting code in order to give it pretty formatting.

You need to follow the Rule of Three. What I suspect is happening is that when you push_back(temp), temp then goes out of scope and gets destroyed (and it frees its sprite). However, because you aren't following the Rule of Three, the present that just got added to the vector happens to have the same sprite inside of it, when means that a) it now is invalid because temp destroyed the sprite that the two objects were sharing, and b) it too will try to free the sprite when it gets destroyed, resulting in a double free.
[ I was ninja'd 71 times before I stopped counting a long time ago ] [ f.k.a. MikeTacular ] [ My Blog ] [ SWFer: Gaplessly looped MP3s in your Flash games ]




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