[C++]PROBLEME URGENT SVP

Fermé
LXir - 21 mars 2004 à 10:10
Reeter Messages postés 120 Date d'inscription mercredi 13 août 2003 Statut Membre Dernière intervention 6 décembre 2005 - 22 mars 2004 à 23:14
Salut,
J'ai un probleme avec le code suivant qui doit generer un labyrinthe aléatoire (main.c utilise les bibliothèques allegro et mur.bmp est un simple bitmap 20*20 pxls)

main.c :
#include <stdlib.h>
#include "gen_laby.h"
#include <allegro.h>

int laby[40][30],a,b;
BITMAP *mur;

// Fonction main
int main()
{
// Initialisation d'allegro
allegro_init();

// Mise en place du clavier
install_keyboard();

// Mise en place de la souris
if (install_mouse() == -1)
{
allegro_message("Erreur ! %s", allegro_error) ;
return 1 ;
}

// Définition de la profondeur de couleur
set_color_depth(16);

// Mise en place du mode graphique
if (set_gfx_mode(GFX_AUTODETECT, 800, 600, 0, 0) != 0)
{
set_gfx_mode(GFX_TEXT, 0, 0, 0, 0);
allegro_message("Impossible d'initialiser le mode vidéo !\n%s\n", allegro_error);
return 1;
}

mur=load_bitmap("mur.bmp",NULL);

genere_laby(38,28,&laby[0][0],100);
for (b=0;b<28;b++)
for (a=0;a<38;a++)
{
if (laby[a][b]==MUR)
draw_sprite(screen,mur,a*20,b*20);
}

// Boucle principale
while (!key[KEY_ESC])
{
}
return 0;

**********************************
gen_laby.h :
#include <stdlib.h>
#include <mem.h>

#define HAUT 1
#define DROITE 2
#define BAS 3
#define GAUCHE 4

#define VIDE 0
#define MUR 1

// Fonction qui génère le labyrinthe de dimension dim_x, dim_y
// à enregistrer dans le tableau de taille [dim_x][dim_y] vers
// lequel pointe *lab à partir de la clef.
void genere_laby(int dim_x, int dim_y, int *lab, int clef)
{
int init[dim_x][dim_y], laby[dim_x][dim_y], poss[4], nbr_poss, a, b, c;
int x, y, direction;

// Initialisation du generateur de nombres aleatoires
srand(clef);

// Initialisations
memset(poss, 0, 4*sizeof(int) );
memset(init, 0, dim_x*dim_y*sizeof(int) );
memset(laby, MUR, dim_x*dim_y*sizeof(int)) ;

// Premier tunnel
x=1;
y=1;
init[x][y]=1;
laby[x][y]=VIDE;
while (1)
{
nbr_poss=0;
c=0;
if ((y-2>=0)&&(y-2<dim_y))
if (init[x][y-2]==0)
{
nbr_poss++;
poss[c]=HAUT;
c++;
}
if ((y+2>=0)&&(y+2<dim_y))
if (init[x][y+2]==0)
{
nbr_poss++;
poss[c]=BAS;
c++;
}
if ((x-2>=0)&&(x-2<dim_x))
if (init[x-2][y]==0)
{
nbr_poss++;
poss[c]=GAUCHE;
c++;
}
if ((x+2>=0)&&(x+2<dim_x))
if (init[x+2][y]==0)
{
nbr_poss++;
poss[c]=DROITE;
c++;
}
if (nbr_poss==0)
break;
direction=rand()%nbr_poss;
if (poss[direction]==HAUT)
{
init[x][y-2]=1;
laby[x][y-1]=VIDE;
laby[x][y-2]=VIDE;
y=y-2;
}
if (poss[direction]==BAS)
{
init[x][y+2]=1;
laby[x][y+1]=VIDE;
laby[x][y+2]=VIDE;
y=y+2;
}
if (poss[direction]==DROITE)
{
init[x+2][y]=1;
laby[x+1][y]=VIDE;
laby[x+2][y]=VIDE;
x=x+2;
}
if (poss[direction]==GAUCHE)
{
init[x-2][y]=1;
laby[x-1][y]=VIDE;
laby[x-2][y]=VIDE;
x=x-2;
}
}

// On creuse le labyrinthe
for (a=0;a<dim_x;a++)
for (b=0;b<dim_y;b++)
if (init[a][b]==0)
{

// Initialisation du tunnel
x=a;
y=b;
init[x][y]=1;
laby[x][y]=VIDE;
nbr_poss=0;
c=0;

// On relie le tunnel au labyrinthe
if ((y-2>=0)&&(y-2<dim_y))
if ((laby[x][y-1]+laby[x][y-2])==(MUR+VIDE))
{
nbr_poss++;
poss[c]=HAUT;
c++;
}
if ((y+2>=0)&&(y+2<dim_y))
if ((laby[x][y+1]+laby[x][y+2])==(MUR+VIDE))
{
nbr_poss++;
poss[c]=BAS;
c++;
}
if ((x-2>=0)&&(x-2<dim_x))
if ((laby[x-1][y]+laby[x-2][y])==(MUR+VIDE))
{
nbr_poss++;
poss[c]=GAUCHE;
c++;
}
if ((x+2>=0)&&(x+2<dim_x))
if ((laby[x+1][y]+laby[x+2][y])==(MUR+VIDE))
{
nbr_poss++;
poss[c]=DROITE;
c++;
}
direction=rand()%nbr_poss;
if (poss[direction]==HAUT)
{
laby[x][y-1]=VIDE;
laby[x][y-2]=VIDE;
}
if (poss[direction]==BAS)
{
laby[x][y+1]=VIDE;
laby[x][y+2]=VIDE;
}
if (poss[direction]==DROITE)
{
laby[x+1][y]=VIDE;
laby[x+2][y]=VIDE;
}
if (poss[direction]==GAUCHE)
{
laby[x-1][y]=VIDE;
laby[x-2][y]=VIDE;
}

// On creuse le tunnel
while (1)
{
nbr_poss=0;
c=0;
if ((y-2>=0)&&(y-2<dim_y))
if (init[x][y-2]==0)
{
nbr_poss++;
poss[c]=HAUT;
c++;
}
if ((y+2>=0)&&(y+2<dim_y))
if (init[x][y+2]==0)
{
nbr_poss++;
poss[c]=BAS;
c++;
}
if ((x-2>=0)&&(x-2<dim_x))
if (init[x-2][y]==0)
{
nbr_poss++;
poss[c]=GAUCHE;
c++;
}
if ((x+2>=0)&&(x+2<dim_x))
if (init[x+2][y]==0)
{
nbr_poss++;
poss[c]=DROITE;
c++;
}
if (nbr_poss==0)
break;
direction=rand()%nbr_poss;
if (poss[direction]==HAUT)
{
init[x][y-2]=1;
laby[x][y-1]=VIDE;
laby[x][y-2]=VIDE;
y=y-2;
}
if (poss[direction]==BAS)
{
init[x][y+2]=1;
laby[x][y+1]=VIDE;
laby[x][y+2]=VIDE;
y=y+2;
}
if (poss[direction]==DROITE)
{
init[x+2][y]=1;
laby[x+1][y]=VIDE;
laby[x+2][y]=VIDE;
x=x+2;
}
if (poss[direction]==GAUCHE)
{
init[x-2][y]=1;
laby[x-1][y]=VIDE;
laby[x-2][y]=VIDE;
x=x-2;
}
}

// On relie la fin du tunnel au labyrinthe
if ((y-2>=0)&&(y-2<dim_y))
if ((laby[x][y-1]+laby[x][y-2])==(MUR+VIDE))
{
nbr_poss++;
poss[c]=HAUT;
c++;
}
if ((y+2>=0)&&(y+2<dim_y))
if ((laby[x][y+1]+laby[x][y+2])==(MUR+VIDE))
{
nbr_poss++;
poss[c]=BAS;
c++;
}
if ((x-2>=0)&&(x-2<dim_x))
if ((laby[x-1][y]+laby[x-2][y])==(MUR+VIDE))
{
nbr_poss++;
poss[c]=GAUCHE;
c++;
}
if ((x+2>=0)&&(x+2<dim_x))
if ((laby[x+1][y]+laby[x+2][y])==(MUR+VIDE))
{
nbr_poss++;
poss[c]=DROITE;
c++;
}
direction=rand()%nbr_poss;
if (poss[direction]==HAUT)
{
laby[x][y-1]=VIDE;
laby[x][y-2]=VIDE;
}
if (poss[direction]==BAS)
{
laby[x][y+1]=VIDE;
laby[x][y+2]=VIDE;
}
if (poss[direction]==DROITE)
{
laby[x+1][y]=VIDE;
laby[x+2][y]=VIDE;
}
if (poss[direction]==GAUCHE)
{
laby[x-1][y]=VIDE;
laby[x-2][y]=VIDE;
}
}
memmove(lab, laby, dim_x*dim_y*sizeof(int) );
return;
}

lors de l'éxecution, windows renvoie une erreur.
Merci de m'aider.

3 réponses

Reeter Messages postés 120 Date d'inscription mercredi 13 août 2003 Statut Membre Dernière intervention 6 décembre 2005
21 mars 2004 à 11:24
c'est dans quel coin de ton programme? perso j'ai la flemme de tout lire, mais si tu me dis dans quel coin regarder, et le genre d'erreur que t'as, ca devrait etre plus motivant!! :-)
0
l'erreur est : "GENERATEUR a causé une erreur de division dans le module GENERATEUR.EXE à 015F:004019BC"
(vachement explicite...)
0
Reeter Messages postés 120 Date d'inscription mercredi 13 août 2003 Statut Membre Dernière intervention 6 décembre 2005 > LXir
21 mars 2004 à 14:17
et t'as moyen de voir de quel coin de ton code ca vient (genre avec des printf ou des conneries comme ca...)? parce qu'il est long a lire, et j'ai pas de compilo sur ma machine
0
LXir > Reeter Messages postés 120 Date d'inscription mercredi 13 août 2003 Statut Membre Dernière intervention 6 décembre 2005
21 mars 2004 à 14:48
non, apres quelques essais de suppressions de code, je suis sur que le probleme est quequepart dans gen_laby.h mais je n'en sais pas plus. dsl.
0
Reeter Messages postés 120 Date d'inscription mercredi 13 août 2003 Statut Membre Dernière intervention 6 décembre 2005 > LXir
21 mars 2004 à 19:42
bon..... essaie de mettre des printf partout, histoire que ton prog affiche quelque chose a tout moment. comme ca, tu pourras exactement voir a quel endroit ca plante. ..
ca peut être tout con comme erreur....

dsl pour le peu d'aide que je t'offre! (ca a au moins le mérite de remmonter le sujet dans le forum! :-) ) mais si tu me dis dans quel coin cela se trouve, ca devrait etre plus facile! !
0
LXir > Reeter Messages postés 120 Date d'inscription mercredi 13 août 2003 Statut Membre Dernière intervention 6 décembre 2005
22 mars 2004 à 18:36
Apres avoir placé de nombreux printf (enfin ceux correspondant à allegro...) j'ai conclu que le probleme se trouvait au niveau de la commande :
direction=rand()%nbr_poss;

Pour une raison qui m'échappe encore, nbr_poss prend une valeur négative (alors que ce n'est normalement pas possible) et alors la fonction modulo renvoie l'erreur.

Merci tout de meme pour ton aide,
LXir
0
TheFox Messages postés 145 Date d'inscription lundi 22 mars 2004 Statut Membre Dernière intervention 16 mai 2004 10
22 mars 2004 à 22:50
c indebuggable ton truc!
en +, il y a plusieurs lignes du type direction = ... !!!
je sais pas avec quel comilo tu bosses, mais si tu as un envt de develt, utilises des points d'arrets et regarde les valeurs de tes variables!

TheFox, le Mr Renard de l'informatique
signez le livre d'or anti fogiel: http://leloup.j.free.fr
0
Reeter Messages postés 120 Date d'inscription mercredi 13 août 2003 Statut Membre Dernière intervention 6 décembre 2005
22 mars 2004 à 23:14
je crois bien que t'as une boucle infinie, mais je suis pas sûr... regarde bien ton while, ca expliquerait pourquoi ta variable devient négative (cf mon dernier post)
0