Mon programme plante ainsi "Programme a généré des erreurs et sera fermé par windows ect..." DOnc je me suis dit, je vais tester la fonction debuger de dev c++... Et je teste la fonction, et ça me rend ça :
WARNING
Une violation d´accès (erreur de segmentation) est apparue dans votre programme
Voila...
Mais ça veut dire quoi ça ? Qu´est-ce qui fait planter mon programme ?
bon, kesaco une segmentation fault.
Ca veut dire que tu accede a une adresse memoire (en lecture par exemple) pour laquel tu n´as pas le droit d´y lire.
La plupart du temps cela vient d´un depassement de tableau, d´un objet detruit mais toujours referencé, ou d´un access sur un pointeur non initialisé.
a mon avis ton debugeur doit pouvoir te dire quel fonction a provoqué cette seg fault.
regarde en amont si tu ne trouve pas une erreur.
Erreur de chargement de SDL_Surface* à tout hasard ?
Ok je vais regarder.
Merci !!
Le truc étrange c´est que dans les fonctions appelées, c´est vide...
Je suppose que le main n´est pas considérer comme une fonction ?
Mais le premier truc qui se passe, c´est un init_sdl(); dans le main, donc ça se passe avant, non ? Voir peut etre en extérieur du main ?
Met des printf partout... Tu verra ou ca plantera...
Plus tes projets seront gros plus t´en rencontrera (de segfault) au fait...
Pour l´insntant, c´est le meme projet que la dernière fois, sauf que j´y ai rajouter la gestion des clics de souris.
Le seul truc, c´est que printf est inutile, puisque le sdl ne se lance meme pas... Ca plante au démarage du programme !!
Y a jamais rien d´etrange, tout a toujours une explication.
Pour voir ou ca plante, utilise le debugger et trace pas a pas le code pour trouver l´endroit.
Ca fonctionne comment le pas a pas ?
Tu mets un point d´arret au debut de ton code ("Breakpoint") et tu lance. Le programme doit s´arretter sur ton point d´arret, te permettant dans ton editeur de voir l´etat des variables, de la memoire, etc ... Ensuite tu peux avancer ligne par ligne dans ton programme ("pas a pas").
JYY avait fait un beau message ou une belle page la dessus. Je souviens plus ou c´est.
sous windows, gcc (donc Dev C++) gère très mal la pile des programmes : si tu alloue en statique (dans le code et non pas avec un new que ce soit au niveau global ou au niveau d´une fonction) un gros tableau tu aura immenquablement un seg-fault au lancement du programme ou à l´entrée dans la fonction (si c´est main, c´est avant que du code soit exécuté).
Ca peut donc venir de là.
Pour le debugger de dev-c++ voici un pt´it lien :
http://www.dil.univ-mrs.fr/~garreta/generique/autres/UtiliserDevCpp.html#Debogage
Voici le topic dont parle Lapintade.
Oulaaaaaaa...
Quand je met le curseur sur :
-->int main(int argc ,char **argv)<--
{
Et que je fasse "executer jusqu´au curseur"
Il me met le meme bug...
DOnc ça doit venir d´ou ?
N_cortex:
wall ton code, je regarde ca si j´ai 5 minutes.
SDL_Surface* screen;
SDL_Event event;
char key[400];
int xsouris=0,ysouris=0,xrelsouris=0,yrelsouris=0;
int Bmouse(int b);
char boutons[3]={0,0,0};
//toutes les structures des objets
struct joueur
{
int armed;
int score;
int vies;
};
struct balle
{
int x;
int y;
int v;
bool in;
};
struct vaisseau_spatial
{
int x;
int y;
int anim;
bool in;
};
struct briques
{
int x;
int y;
bool in;
};
struct missiles
{
int x;
int y;
bool in;
int dirx;
};
//initialisation de sdl + updates events ect (merci JYY ^^)
void init_SDL()
{
SDL_Init(SDL_INIT_VIDEO);
screen = SDL_SetVideoMode(800, 600, 32,SDL_HWSURFACE|SDL_DOUBLEBUF|SDL_FULLSCREEN);
SDL_ShowCursor(0);
}
int Bmouse(int b)
{
int res;
if (b<0 ||b>2)
return 0;
res=boutons[b+1];
return res;
}
void UpdateEvents()
{
SDL_Event event;
while(SDL_PollEvent(&event))
{
switch (event.type)
{
case SDL_KEYDOWN:
key[event.key.keysym.sym]=1;
break;
case SDL_KEYUP:
key[event.key.keysym.sym]=0;
break;
case SDL_MOUSEMOTION:
xsouris=event.motion.x;
ysouris=event.motion.y;
xrelsouris=event.motion.xrel;
yrelsouris=event.motion.yrel;
break;
}
}
}
SDL_Rect Rect(int x,int y,int w=0,int h=0)
{
SDL_Rect r;
r.x=x;
r.y=y;
r.w=w;
r.h=h;
return r;
}
void Blit(SDL_Surface* source, SDL_Surface* dest, int X, int Y)
{
SDL_Rect R;
R.x = X;
R.y = Y;
R.w=R.h=0;
SDL_BlitSurface(source,NULL,dest,&R);
}
SDL_Surface* LoadBMP(char* fichier,int vram=1)
{
SDL_Surface* f = SDL_LoadBMP(fichier);
SDL_Surface* r=NULL;
if (vram)
r=SDL_CreateRGBSurface(SDL_HWSURFACE, f->w, f->h, 32, 0, 0, 0, 0);
if (r==NULL) vram=0;
if (!vram)
r=SDL_CreateRGBSurface(SDL_SWSURFACE, f->w, f->h, 32, 0, 0, 0, 0);
SDL_Rect R=Rect(0,0,f->w,f->h);
SDL_BlitSurface(f,NULL,r,&R);
SDL_FreeSurface(f);
return r;
}
int main(int argc ,char **argv)
{
//déclaration des variables + structures
int s=1, pos_x=20, pos_y=0, i=0, start=0;
int sx4=0,sy4=0;
init_SDL();
//structures
struct balle ball;
ball.x = 100;
ball.y = 300;
ball.v = 10;
ball.in = true;
struct missiles missile;
missile.x = 0;
missile.y = 0;
missile.in = false;
struct vaisseau_spatial vaisseau;
vaisseau.x = 0;
vaisseau.y = 590;
vaisseau.in = true;
vaisseau.anim = 1;
struct joueur p;
p.armed = 0;
p.score = 0;
p.vies = 3;
struct briques briks[297];
for (i=0; i<296; i++)
{
briks[i].x = pos_x;
briks[i].y = pos_y;
briks[i].in = true;
pos_x = pos_x + 20;
if (pos_x >= 760) {pos_y += 10;pos_x = 20;}
}
//création des surfaces
SDL_Surface* firstscreen;
SDL_Surface* img_balle;
SDL_Surface* img_vaisseau;
SDL_Surface* img_vaisseaug;
SDL_Surface* img_vaisseaud;
SDL_Surface* img_vaisseaug2;
SDL_Surface* img_vaisseaud2;
SDL_Surface* img_brique;
SDL_Surface* img_missile;
SDL_Surface* img_fumee;
int fini=0;
//creation des objets + transparence
firstscreen=LoadBMP("images/backgrounds/font_etoil
es.bmp");
img_balle=LoadBMP("images/objects/balle.bmp");
img_vaisseau=LoadBMP("images/objects/vaisseau.bmp"
);
img_vaisseaug=LoadBMP("images/objects/vaisseau-g.b
mp");
img_vaisseaud=LoadBMP("images/objects/vaisseau-d.b
mp");
img_vaisseaug2=LoadBMP("images/objects/vaisseau-g2
.bmp");
img_vaisseaud2=LoadBMP("images/objects/vaisseau-d2
.bmp");
img_brique=LoadBMP("images/objects/brique_bleu.bmp
");
img_missile=LoadBMP("images/objects/missile.bmp");
img_fumee=LoadBMP("images/objects/fumee.bmp");
SDL_SetColorKey(img_balle,SDL_SRCCOLORKEY ,SDL_MapRGBA(img_balle->format,255,0,255,0));
SDL_SetColorKey(img_vaisseau,SDL_SRCCOLORKEY ,SDL_MapRGBA(img_vaisseau->format,255,0,255,0));
SDL_SetColorKey(img_vaisseaug,SDL_SRCCOLORKEY
,SDL_MapRGBA(img_vaisseaug->format,255,0,255,0));
SDL_SetColorKey(img_vaisseaud,SDL_SRCCOLORKEY
,SDL_MapRGBA(img_vaisseaud->format,255,0,255,0));
SDL_SetColorKey(img_vaisseaug2,SDL_SRCCOLORKEY
,SDL_MapRGBA(img_vaisseaug2->format,255,0,255,0));
SDL_SetColorKey(img_vaisseaud2,SDL_SRCCOLORKEY
,SDL_MapRGBA(img_vaisseaud2->format,255,0,255,0));
SDL_SetColorKey(img_brique,SDL_SRCCOLORKEY ,SDL_MapRGBA(img_brique->format,255,0,255,0));
SDL_SetColorKey(img_missile,SDL_SRCCOLORKEY ,SDL_MapRGBA(img_missile->format,255,0,255,0));
SDL_SetColorKey(img_fumee,SDL_SRCCOLORKEY ,SDL_MapRGBA(img_fumee->format,255,0,255,0));
while(1) //boucle principale
{
UpdateEvents(); //recherche d´events, et quitte si echap ou lance la balle si return
if (key[SDLK_RETURN] && start == 0) {sy4 = -1; sx4 = 1; start = 1;}
if (key[SDLK_ESCAPE]) break;
if (Bmouse(2))
{
if (p.armed != 0)
{
switch(p.armed)
{
case 1:
missile.dirx = xsouris;
missile.in = true;
break;
}
}
}
if (xrelsouris > 0) vaisseau.anim = 0;
if (xrelsouris == 0) vaisseau.anim = 1;
if(xrelsouris < 0) vaisseau.anim = 2;
//mouvements de la balle
ball.x+=ball.v*sx4;
ball.y+=ball.v*sy4;
// mouvements du vaisseau
vaisseau.x = xsouris - 100;
if (vaisseau.x < 0) vaisseau.x = 0;
if (vaisseau.x > 700) vaisseau.x = 700;
//mouvements des missiles
if (missile.y <= 0 && missile.in == true)
{
missile.x = missile.dirx;
missile.y += 12;
}
//balle sur la barre
if (start == 0){ball.x = vaisseau.x + 45; ball.y = vaisseau.y - 15;}
//restart si la balle meurt
if (ball.in == false)
{
ball.in = true;
start = 0;
}
//rebonds de la balle
if (ball.x<0) sx4=1;
if (ball.y<0) sy4=1;
if (ball.x>785) sx4=-1;
if (ball.y + 16 >= vaisseau.y && ball.x >= vaisseau.x && ball.x <= vaisseau.x + 100 ) sy4=-1;
if (ball.y > 600) ball.in=false;
for (i=0; i < 296; i++)
{
if (ball.y >= briks[i].y && ball.y <= briks[i].y + 14 && ball.x >= briks[i].x && ball.x <= briks[i].x + 20 ) {briks[i].in = false; sy4 = -(sy4); briks[i].x = 1024; briks[i].y = 1024;} //rebond bas
if (ball.y + 16 >= briks[i].y && ball.y + 16 <= briks[i].y + 14 && ball.x >= briks[i].x && ball.x <= briks[i].x + 35 ) {briks[i].in = false; sy4 = -(sy4);briks[i].x = 1024; briks[i].y = 1024;} //rebond haut
if (ball.x >= briks[i].x && ball.x <= briks[i].x + 33 && ball.y >= briks[i].y && ball.y <= briks[i].y + 10 ) {briks[i].in = false; sx4 = -(sx4);briks[i].x = 1024; briks[i].y = 1024; } //rebond gauche
if (ball.x + 15 >= briks[i].x && ball.x + 15 <= briks[i].x + 20 && ball.y >= briks[i].y && ball.y <= briks[i].y + 10 ) {briks[i].in = false; sx4 = -(sx4);briks[i].x = 1024; briks[i].y = 1024; } //rebond droite
}
// génération a l´écran
SDL_BlitSurface(firstscreen,NULL,screen,NULL);
if (ball.in == true)Blit(img_balle,screen,ball.x, ball.y);
if (vaisseau.in == true)
{
Blit(img_vaisseau,screen,vaisseau.x + 30, vaisseau.y);
if (vaisseau.anim == 2)Blit(img_vaisseaud2,screen,vaisseau.x + 60, vaisseau.y);
else Blit(img_vaisseaud,screen,vaisseau.x + 60, vaisseau.y);
if (vaisseau.anim == 0)Blit(img_vaisseaug2,screen,vaisseau.x, vaisseau.y);
else Blit(img_vaisseaug,screen,vaisseau.x , vaisseau.y);
}
for (i=0;i<296;i++)
{
if(briks[i].in ==
true)Blit(img_brique,screen,briks[i].x,briks[i].y)
;
}
if (missile.in == true)
{
Blit(img_missile,screen,missile.x,missile.y);
}
SDL_Flip(screen);
}
SDL_Quit();
SDL_ShowCursor(1);
return 0;
}
Le debug de dev-c++ c´est merdique...
chargement des images qui sont dans le dossier image :
"image\\sprite0.bmp" ... je pense que ça vient de la ?
En effet ce genre de trucs ne marche pas sur 90% des OS...