I'm learning SDL but I have run across a problem which I can't understand. For some reason, whenever I try to convert an image to the display format it returns a NULL pointer. I've checked the linker and order of functions and everything is right.

Curiously, if instead of trying to optimize the image I just load it and don't optimize, the image appears. Optimizing it does not.

#include<SDL\SDL.h>
#include<SDL\SDL_image.h>

SDL_Surface *cargarImagen(char* imagen);
void aplicarImagen(int x, int y, SDL_Surface *origen, SDL_Surface *destino);

int main(int argc, char *args[])
{
bool quitProgram=0;
SDL_Event event;
SDL_Surface *screen;
SDL_Surface *mensaje;
SDL_Surface *fondo;
SDL_Init(SDL_INIT_EVERYTHING);
mensaje=cargarImagen("mensaje.png");
fondo=cargarImagen("fondo.png");
screen=SDL_SetVideoMode(640,480,32,SDL_SWSURFACE);
while(quitProgram==0)
    {
    SDL_PollEvent(&event);
    if(event.type==SDL_QUIT) {quitProgram=1;}
    if(event.type==SDL_KEYDOWN)
        {
        aplicarImagen(100,100,fondo,screen);
        SDL_Flip(screen);
        SDL_Delay(1500);
        }
    else {aplicarImagen(100,100,mensaje,screen);}
    SDL_Flip(screen);
    }
SDL_FreeSurface(mensaje);
SDL_FreeSurface(fondo);
SDL_Quit();
return 0;
}


SDL_Surface *cargarImagen(char* imagen)
{
SDL_Surface* loadedImage = NULL; 
SDL_Surface* optimizedImage = NULL; 
loadedImage = IMG_Load(imagen); 
if( loadedImage != NULL ) 
    { 
    optimizedImage = SDL_DisplayFormat( loadedImage ); 
    SDL_FreeSurface( loadedImage );
    } 
return optimizedImage;
}


void aplicarImagen(int x, int y, SDL_Surface *origen, SDL_Surface *destino)
{
SDL_Rect aux;
aux.x=x;
aux.y=y;
SDL_BlitSurface(origen,NULL,destino,&aux);
return;
}

Is there anything wrong with the code?

move the statement

screen=SDL_SetVideoMode(640,480,32,SDL_SWSURFACE);

before the function calls to cargarImagen.

So the function returned null because there was no screen surface at all to convert to. I'll have to look at it more carefully next time. Thank you, it works now =)