I don't have any trouble when I declare
SDL_Surface *dot = NULL;
globally, but if the SDL_Surface is unique to the class I cant set it to NULL, so thought it would be fine if I declare it in the constructor like
 dot = load_image( "dot.bmp" );
but I still get a
Unhandled exception at 0x1002b195 in Uber Mario.exe: 0xC0000005: Access violation reading location 0x0000013c.
on the load_image which returns a SDL_Surface*, sometimes that happened to be because the image was bad or a certain img filetype so i tried another image that does work elsewhere but it still errors like this.
i think im just not using the pointers correctly, even though i studied pointers in school and have read facts on them, for some reason i always have trouble with them. load_image returns a *SDL_Surface so i need to use a pointer...i think.
here is the class:
class Character
{
    private:
    int yVel, xVel;
    int xAcc, yAcc;
    int spd, maxV;
    int JumpPower;
    int FacingRight, FacingLeft;//directing status 0 or 1
    bool Flying, onGround;
    //Type of particle
    SDL_Surface *type;
    public:
    Shine *myShine;
    Animation *walking;
    SDL_Surface *dot;
          //Offsets
    SDL_Rect Rect;
    Character();
    void handle_input();
    void move();
    void show();
    void togglefly();
    void jump();
    void whereami();// check and set various characters statuses
};   
Character::Character()
{
    //Set offsets
    Rect.x = 150;
    Rect.y = 150;
    Rect.w = 20;
    Rect.h = 20;
    yVel = 0;
    xVel = 0;
    yAcc = 0;
    xAcc = 0;
    maxV = 30;
    spd = 2;
    JumpPower = 40;
    Flying = true;
    myShine = new Shine(Rect.x, Rect.y);
//  walking = new Animation("mario.bmp", 3, 0, 0, Rect.w, Rect.h);
            dot = new SDL_Surface();
    dot = load_image( "dot.bmp" );
    myShine->setpos(Rect);
    myShine->setRange(Rect.h*1.5);
}
the load image function:
SDL_Surface *load_image( std::string filename )
{
    //The image that's loaded
    SDL_Surface* loadedImage = NULL;
    //The optimized surface that will be used
    SDL_Surface* optimizedImage = NULL;
    //Load the image
    loadedImage = IMG_Load( filename.c_str() );
    //If the image loaded
    if( loadedImage != NULL )
    {
        //Create an optimized surface
        optimizedImage = SDL_DisplayFormat( loadedImage ); //EXCEPTION OCCURES HERE
        //Free the old surface
        SDL_FreeSurface( loadedImage );
        //If the surface was optimized
        if( optimizedImage != NULL )
        {
            //Color key surface
            SDL_SetColorKey( optimizedImage, SDL_SRCCOLORKEY, SDL_MapRGB( optimizedImage->format, 0, 0xFF, 0xFF ) );
        }
    }
    //Return the optimized surface
    return optimizedImage;
init function
    bool init()
{
    //Initialize all SDL subsystems
    if( SDL_Init( SDL_INIT_EVERYTHING ) == -1 )
    {
        return false;
    }
    //Set up the screen
    screen = SDL_SetVideoMode( SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_BPP, SDL_SWSURFACE );
    //If there was an error in setting up the screen
    if( screen == NULL )
    {
        return false;
    }
    //Set the window caption
    SDL_WM_SetCaption( "Particle Test", NULL );
    //Seed random
    srand( SDL_GetTicks() );
    //If everything initialized fine
    return true;
}
By the way, aren't you leaking resources executing that code:
dot = new SDL_Surface();
dot = load_image( "dot.bmp" );
Doing load_image causes you to loose pointer to SDL_Surface() object hence you cannot delete it later.
Answer to your main issue
Call SDL_Init before using SDL_DisplayFormay and it should work. Citation from SDL documentation.
Newbie hint
You have to call SDL_Init before using the SDL_DisplayFormat function. If you don't, your program will crash with an access violation.
You know, dot is a pointer,and it was allocated dynamiclly. SDL_Surface *dot=new SDL_Surface();means that you allocate a storage space in heap,and dot index this space. And,the function load_image(string) return a SDL_Surface type value,that is an object,the return object was assignmented to the pointer dot,then pointer dot changed it's direction,then this makes a memory leak. You can modify the program by this:
SDL_Surface *dot;
dot = load_image("dot.bmp");
thank you.
User contributions licensed under CC BY-SA 3.0