Sign in to follow this  
TTT_Dutch

I need Segfault Help

Recommended Posts

Alright guys,

 

I am soo close to getting done with the Tile Rendering portion of my game, but I have run into a problem that seems unsolvable. I am running this code: 

sf::View view = App->getView();

   /* Culling code */
   int startX = (view.getCenter().x - view.getSize().x)/TILE_WIDTH;
   int endX = (view.getCenter().x + view.getSize().x)/TILE_WIDTH;
   int startY = (view.getCenter().y - view.getSize().y)/TILE_HEIGHT;
   int endY = (view.getCenter().y + view.getSize().y)/TILE_HEIGHT;

   if(startX > MAP_WIDTH)
      startX = MAP_WIDTH;
   if(startX < 0)
      startX = 0;

   if(startY > MAP_HEIGHT)
      startY = MAP_HEIGHT;
   if(startY < 0)
      startY = 0;

   if(endY > MAP_HEIGHT)
      endY = MAP_HEIGHT;
   if(endY < 0)
      endY = 0;

   if(endX > MAP_WIDTH)
      endX = MAP_WIDTH;
   if(endX < 0)
      endX = 0;


   for(int y = startY; y < endY; y++)
   {
      for(int x = startX; x < endX; x++)
      {
         m_Sprites[GetTile(x,y)].setPosition(x* TILE_WIDTH,y* TILE_HEIGHT);

         App->draw(m_Sprites[GetTile(x,y)]);

      }
   }

 

I am getting a segfault when I try to draw the sprites. I also ran valgrind and found there was an invalid write of 4 bytes when I set the position of the sprite. I also found memory is leaking somewhere when I run it but I can't find where :/. I can post my whole .cpp file if need. Anyone have any ideas why I am getting a segfault in this portion of the program? If not, could any of you wonderful people please help me debug it?

 

Thankyou very much!!
-Brent

Share this post


Link to post
Share on other sites
Alright guys,

 

I am soo close to getting done with the Tile Rendering portion of my game, but I have run into a problem that seems unsolvable. I am running this code: 

sf::View view = App->getView();

   /* Culling code */
   int startX = (view.getCenter().x - view.getSize().x)/TILE_WIDTH;
   int endX = (view.getCenter().x + view.getSize().x)/TILE_WIDTH;
   int startY = (view.getCenter().y - view.getSize().y)/TILE_HEIGHT;
   int endY = (view.getCenter().y + view.getSize().y)/TILE_HEIGHT;

   if(startX > MAP_WIDTH)
      startX = MAP_WIDTH;
   if(startX < 0)
      startX = 0;

   if(startY > MAP_HEIGHT)
      startY = MAP_HEIGHT;
   if(startY < 0)
      startY = 0;

   if(endY > MAP_HEIGHT)
      endY = MAP_HEIGHT;
   if(endY < 0)
      endY = 0;

   if(endX > MAP_WIDTH)
      endX = MAP_WIDTH;
   if(endX < 0)
      endX = 0;


   for(int y = startY; y < endY; y++)
   {
      for(int x = startX; x < endX; x++)
      {
         m_Sprites[GetTile(x,y)].setPosition(x* TILE_WIDTH,y* TILE_HEIGHT);

         App->draw(m_Sprites[GetTile(x,y)]);

      }
   }

 

I am getting a segfault when I try to draw the sprites. I also ran valgrind and found there was an invalid write of 4 bytes when I set the position of the sprite. I also found memory is leaking somewhere when I run it but I can't find where :/. I can post my whole .cpp file if need. Anyone have any ideas why I am getting a segfault in this portion of the program? If not, could any of you wonderful people please help me debug it?

 

Thankyou very much!!
-Brent

I don't want to be fussy but I always try to avoid posible nulls and call the same function with the same parameters twice, I think this code is much more debuggeable and clear

 

...

unsigned int uTile = GetTile(x,y);

 

if (!uTile)

    continue; // or control error or whatever

 

Sprite *pSprite = m_Sprites[uTile];

 

if (!pSprite)

   continue; // or control error or whatever

 

 pSprite.setPosition(x* TILE_WIDTH,y* TILE_HEIGHT);

 App->draw(pSprite);

Share this post


Link to post
Share on other sites

Alright so I changed my code to about the same thing as the suggested code above (Thanks Ravnock!). Once I did that I printed the value of uTile with GDB and it says: $1 = 49 '1' . So that means GetTile is returning actual chars instead of numbers! ohmy.png Can anyone tell me why that is? Here is my function:

uint8 TileMap::GetTile(unsigned int x, unsigned int y)
{
   return this->m_Tiles[(y * MAP_WIDTH) + x];
}

 
Oh and btw I thought I also should mention, m_Tiles is a vector of uint8.
 
Thankyou!
-Brent
 
EDIT: Okay I found the problem! In an above function I am reading the ID's from a file but they are getting stored as characters not ints. So when I use uTile to access the array it was returning 49, which is equal to '1'. SO now I have to figure out how to read numbers or just convert them.
 
EDIT 2: Okay now I converted the chars to ints with this code (this is in my map.load function)

if(file.is_open())
   {
      while (std::getline(file, line))
      {
         std::istringstream iss(line);
         int n;

         while (iss >> n)
         {
            m_Tiles.push_back(n);
         }
         count++;
      }
      if(count > MAP_HEIGHT)
         cout << "there is a problem" << endl;
      
      file.close();
   }

 
I have checked in the debugger and the map seems to be loading the right values now. But when I call App->draw, it is still throwing a segfault:

 sf::View view = App->getView();

   /* Culling code */
   int startX = (view.getCenter().x - view.getSize().x)/TILE_WIDTH;
   int endX = (view.getCenter().x + view.getSize().x)/TILE_WIDTH;
   int startY = (view.getCenter().y - view.getSize().y)/TILE_HEIGHT;
   int endY = (view.getCenter().y + view.getSize().y)/TILE_HEIGHT;

   if(startX > MAP_WIDTH)
      startX = MAP_WIDTH;
   if(startX < 0)
      startX = 0;

   if(startY > MAP_HEIGHT)
      startY = MAP_HEIGHT;
   if(startY < 0)
      startY = 0;

   if(endY > MAP_HEIGHT)
      endY = MAP_HEIGHT;
   if(endY < 0)
      endY = 0;

   if(endX > MAP_WIDTH)
      endX = MAP_WIDTH;
   if(endX < 0)
      endX = 0;


   for(int y = startY; y < endY; y++)
   {
      for(int x = startX; x < endX; x++)
      {
         uint8 uTile = GetTile(x,y);
         
         if(uTile >= TILESHEET_COUNT || uTile < 0)
            cout << "Error Tile out of range: X:" << x << " Y:" << y << " ID:" << uTile << endl;

         sf::Sprite *pSprite = &m_Sprites[uTile];

         if(pSprite == NULL)
            cout << "Errror invalid sprite: ID:" << uTile << endl;

         pSprite->setPosition(x* TILE_WIDTH,y* TILE_HEIGHT);

         App->draw(*pSprite);

      }
   }

EDIT 3: Solved the problem, I tried to call m_Sprites.reserve(TILESHEET_COUNT) (which was 2). For some reason this messed everything up and messed up my whole sprite array too. So I just pushed back tiles instead of reserving the memory. :D

Edited by Riztro

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

Sign in to follow this