Jump to content
  • Advertisement
Sign in to follow this  
TTT_Dutch

I need Segfault Help

This topic is 2127 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

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
Advertisement
GetTile will get positions in the range

0 - (MapSize-1)

Check the gettile thing and make sure it gives a valid position for the array you access.

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
Sign in to follow this  

  • Advertisement
×

Important Information

By using GameDev.net, you agree to our community Guidelines, Terms of Use, and Privacy Policy.

We are the game development community.

Whether you are an indie, hobbyist, AAA developer, or just trying to learn, GameDev.net is the place for you to learn, share, and connect with the games industry. Learn more About Us or sign up!

Sign me up!