Segmentation Fault

Started by
5 comments, last by Shadowdancer 13 years, 3 months ago
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 );
}
}
If this post was helpful please +1 or like it !

Webstrand
Advertisement
It appears your "surface" pointer is NULL or otherwise invalid. Do you have ample error checking in your surface loading code?
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
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")
If this post was helpful please +1 or like it !

Webstrand
Windows understands slashes as path separators just fine.

You can also use boost::filesystem::path in C++.
Thats good news.

When I try to compile a Mac version am I going to have any trouble?

I'm using:
[C++][SDL][OpenGL]
If this post was helpful please +1 or like it !

Webstrand
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.

This topic is closed to new replies.

Advertisement