Jump to content
  • Advertisement
Sign in to follow this  
coderWalker

Segmentation Fault

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

I am making a program that is Cross platform. It compiles and works fine on Windows.
Now I am trying to build it on Ubuntu (Linux). It build fine but crashes.
Upon running the debugger I get:
"<terminated>gdb/mi (1/9/11 5:11 PM) (Exited. Signal 'SIGSEGV' received. Description: Segmentation fault.) "
The debugger stops in the function in the code below.
What is wrong with it?

I'm just so lost, it works fine on Windows.

Thanks in advance,
CoderWalker


//OpenGL Load texture
GLuint GLTex(SDL_Surface* surface){
GLuint texture; // This is a handle to our texture object
GLenum texture_format;
GLint nOfColors;
// Check that the image's width is a power of 2
if ( (surface->w & (surface->w - 1)) != 0 ) { <==========================This is the last line the debugger shows
printf("warning: image.bmp's width is not a power of 2\n");
}

// Also check if the height is a power of 2
if ( (surface->h & (surface->h - 1)) != 0 ) {
printf("warning: image.bmp's height is not a power of 2\n");
}

// get the number of channels in the SDL surface
nOfColors = surface->format->BytesPerPixel;
if (nOfColors == 4) // contains an alpha channel
{
if (surface->format->Rmask == 0x000000ff)
texture_format = GL_RGBA;
else
texture_format = GL_BGRA;
} else if (nOfColors == 3) // no alpha channel
{
if (surface->format->Rmask == 0x000000ff)
texture_format = GL_RGB;
else
texture_format = GL_BGR;
} else {
printf("warning: the image is not truecolor.. this will probably break\n");
// this error should not go unhandled
}

// Have OpenGL generate a texture object handle for us
glGenTextures( 1, &texture );

// Bind the tewxture object
glBindTexture( GL_TEXTURE_2D, texture );

// Set the texture's stretching properties
/////Smooth Textures (isoMetric)
//glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR );
//glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );
////Blocky Texures (FPS)
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);

// Edit the texture object's image data using the information SDL_Surface gives us
glTexImage2D( GL_TEXTURE_2D, 0, nOfColors, surface->w, surface->h, 0,
texture_format, GL_UNSIGNED_BYTE, surface->pixels );
return texture;
// Free the SDL_Surface only if it was successfully created
if ( surface ) {
SDL_FreeSurface( surface );
}
}

Share this post


Link to post
Share on other sites
Advertisement
It appears your "surface" pointer is NULL or otherwise invalid. Do you have ample error checking in your surface loading code?

Share this post


Link to post
Share on other sites
My guess is that "surface" is actually a null pointer, hence the segmentation fault. Check the part of the code where you load the surface from file (or create it) and make sure the surface is successfully created by checking whether or not it's null.

If you're loading from file, it's likely that there's a permission error, or that the path to the file isn't valid on Linux (but is on Windows).

EDIT: haw, new board software doesn't have ninja protection

Share this post


Link to post
Share on other sites
You all were right Surface was a NULL pointer.
The cause in case you're curious was that when moving from Windows to Linux
I didn't realize that the type of slashes changed from \\ to /.

Windows:
load_image("resources\\textures\\atlus.png")

Linux:
load_image("resources/textures/atlus.png")

Is there an easy way to keep this code universal?
Like an enviromental variable specific to Windows and Mac and use that with #ifdef ?

if windows
load_image("resources\\textures\\atlus.png")
if linux
load_image("resources/textures/atlus.png")

Share this post


Link to post
Share on other sites
The situation on Mac seems to be a bit of a charlie foxtrot, since it traditionally used colons as separators. If you are just targeting OSX, use slashes (it's U**x based). Make sure you do not use slashes or colons inside path elements, since things get interesting then.

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.

Participate in the game development conversation and more when you create an account on GameDev.net!

Sign me up!