Ho da tre giorni un problema stranissimo che non riesco a risolvere
Secondo voi al codice all'interno di funzione() cambia qualcosa tra i due pezzetti di codice seguenti? :
codice:
type VAR;
funzione ( & VAR );
codice:
type * VAR = malloc ( sizeof(type);
funzione ( VAR );
Certo che no!
Ma invece con un mio programmino sembra proprio di si'
Ecco il codice:
codice:
#include <stdio.h>
#include <SDL/SDL.h>
#include <SDL/SDL_image.h>
#include <SDL/SDL_rotozoom.h>
#include <stdlib.h>
#include <malloc.h>
#define IMGS_NUM ( 10 )
typedef struct _SZ_
{
SDL_Surface * screen, * imgs [ IMGS_NUM ];
} SZ;
SZ * initgame ( SZ * sz );
int main ( )
{
SZ * sz = malloc ( sizeof(SZ) );
//SZ sz;
initgame ( sz );
//initgame ( & sz );
return 0;
}
SZ * initgame ( SZ * sz )
{
int i;
char * imgpath;
SDL_Rect src, dest;
// Prova ad abilitare le SDL
if ( SDL_Init ( SDL_INIT_VIDEO ) < 0 ) {
fprintf ( stderr, "Impossibile abilitare le SDL: %s\n", SDL_GetError() );
return NULL;
}
// Prima di uscire le SDL vengono disabilitate
atexit ( SDL_Quit );
// Setto la modalita' video richiesta e controllo se e' stata abilitata
if ( ( sz->screen = SDL_SetVideoMode ( 800, 600, 0, SDL_HWSURFACE | SDL_DOUBLEBUF ) ) == NULL ) {
fprintf ( stderr, "Imposibile settare la modalita' video: %s\n", SDL_GetError() );
return NULL;
}
imgpath = (char *) malloc ( 10240 );
// carico tutte le immagini
for ( i = 0; i < IMGS_NUM; i ++ ) {
sprintf ( imgpath, "imgs/%d.jpg", i+1 );
sz->imgs[i] = IMG_Load ( imgpath );
if ( sz->imgs[i] == NULL ) {
printf ( "Non sono riuscito a caricare l'immagine %s.\n", imgpath );
return NULL;
}
src.w = sz->imgs[i]->w;
src.h = sz->imgs[i]->h;
dest.x = 0;
dest.y = 0;
printf ( "Print @ %d, %d: %d, %d\n", dest.x, dest.y, src.w, src.h );
SDL_BlitSurface ( sz->imgs[i], & src, sz->screen, & dest);
SDL_UpdateRect ( sz->screen, 0, 0, 0, 0 );
}
free ( imgpath );
return sz;
}
*Il programma si compila con `gcc -lSDL -lSDL_image -lSDL_gfx -o prova prova.c` ed e' necessario avere installate le SDL, le SDLimage e le SDLgfx.
* E necessario inoltre che nella dir dove si trova l'eseguibile ci sia una sottodir chiamata "imgs" che contenga 10 immagine chiamate "1.jpg", "2.jpg", "3.jpg" ... "10.jpg"
Vedete le quattro linee in grassetto?
Se le invertite (scommentate le due che attualmente sono commmentate e fate l'opposto con le altre due) il programma si comporta in maniera completamente diversa...
Succede che in un caso le immagini vengono stampate nella finestra, mentre nell'altro caso non viene stampato nulla
Perche'???

EDIT: Ho studiato il comportamento del programma con il debugger GDB, e mi sono accorto che e' la SDL_BlitSurface che non fa cio' che dovrebbe...
Pero' il valore che restituisce e' quello che restituisce in caso di successo, ed inoltre a lei cosa cambia di com'e' stato definito sz???