Jump to content

  • Log In with Google      Sign In   
  • Create Account


I need Segfault Help


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
4 replies to this topic

#1 Riztro   Members   -  Reputation: 240

Like
0Likes
Like

Posted 23 December 2012 - 11:57 PM

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



Sponsor:

#2 Khatharr   Crossbones+   -  Reputation: 2908

Like
0Likes
Like

Posted 24 December 2012 - 01:01 AM

What's the debugger say?


void hurrrrrrrr() {__asm sub [ebp+4],5;}

There are ten kinds of people in this world: those who understand binary and those who don't.

#3 Waterlimon   Crossbones+   -  Reputation: 2417

Like
0Likes
Like

Posted 24 December 2012 - 06:56 AM

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.

o3o


#4 Ravnock   Members   -  Reputation: 286

Like
1Likes
Like

Posted 24 December 2012 - 08:13 AM

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



#5 Riztro   Members   -  Reputation: 240

Like
0Likes
Like

Posted 24 December 2012 - 10:30 AM

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, 24 December 2012 - 12:08 PM.





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