Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1017 connectés 

  FORUM HardWare.fr
  Programmation
  C

  Démineur erreur de segmentation

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Démineur erreur de segmentation

n°1949944
-umibozu-
Posté le 14-12-2009 à 00:29:38  profilanswer
 

Salut,
 
Je code un démineur en console, et j'utilise la récursivité (en taous cas j'essaye), j'ai une erreur de segmentation dans la fonction qui dévoile les cases, je la post ici.
J'utilise 2 tableaux, pour l'instant ils sont initialisés normalement donc je dois tester à chaque fois les bords, les coins et les côtés pour éviter justement ce genre d'erreur, mais je ne comprend pas pourquoi ça ne fonctionne pas.
 
[

Code :
  1. void devoileCase(char tableauJeu[TAILLE][TAILLE], char tableauMine[TAILLE][TAILLE], int y, int x)
  2. {
  3. if(tableauMine[y][x] == 0)
  4. {
  5.  tableauJeu[y][x] = VIDE;
  6.  if(x == 0 && y == 0)
  7.  {
  8.   devoileCase(tableauJeu, tableauMine, y+1, x);
  9.   devoileCase(tableauJeu, tableauMine, y+1, x+1);
  10.   devoileCase(tableauJeu, tableauMine, y, x+1);
  11.  }
  12.  else if(x == 0 && (y > 0 && y < TAILLE))
  13.  {
  14.   devoileCase(tableauJeu, tableauMine, y-1, x);
  15.   devoileCase(tableauJeu, tableauMine, y-1, x+1);
  16.   devoileCase(tableauJeu, tableauMine, y, x+1);
  17.   devoileCase(tableauJeu, tableauMine, y+1, x);
  18.   devoileCase(tableauJeu, tableauMine, y+1, x+1);
  19.  }
  20.  else if(x == 0 && y == TAILLE)
  21.  {
  22.   devoileCase(tableauJeu, tableauMine, y, x+1);
  23.   devoileCase(tableauJeu, tableauMine, y-1, x+1);
  24.   devoileCase(tableauJeu, tableauMine, y-1, x);
  25.  }
  26.  else if((x > 0 && x < TAILLE) && y == 0)
  27.  {
  28.   devoileCase(tableauJeu, tableauMine, y, x-1);
  29.   devoileCase(tableauJeu, tableauMine, y, x+1);
  30.   devoileCase(tableauJeu, tableauMine, y+1, x-1);
  31.   devoileCase(tableauJeu, tableauMine, y+1, x);
  32.   devoileCase(tableauJeu, tableauMine, y+1, x+1);
  33.  }
  34.  else if((x > 0 && x < TAILLE) && y == TAILLE)
  35.  {
  36.   devoileCase(tableauJeu, tableauMine, y-1, x-1);
  37.   devoileCase(tableauJeu, tableauMine, y-1, x);
  38.   devoileCase(tableauJeu, tableauMine, y-1, x+1);
  39.   devoileCase(tableauJeu, tableauMine, y, x-1);
  40.   devoileCase(tableauJeu, tableauMine, y, x+1);
  41.  }
  42.  else if(x == TAILLE && (y > 0 && y < TAILLE))
  43.  {
  44.   devoileCase(tableauJeu, tableauMine, y-1, x-1);
  45.   devoileCase(tableauJeu, tableauMine, y-1, x);
  46.   devoileCase(tableauJeu, tableauMine, y, x-1);
  47.   devoileCase(tableauJeu, tableauMine, y+1, x-1);
  48.   devoileCase(tableauJeu, tableauMine, y+1, x);
  49.  }
  50.  else if(x == TAILLE && y == 0)
  51.  {
  52.   devoileCase(tableauJeu, tableauMine, y, x-1);
  53.   devoileCase(tableauJeu, tableauMine, y+1, x-1);
  54.   devoileCase(tableauJeu, tableauMine, y+1, x);
  55.  }
  56.  else if(x == TAILLE && y == TAILLE)
  57.  {
  58.   devoileCase(tableauJeu, tableauMine, y-1, x-1);
  59.   devoileCase(tableauJeu, tableauMine, y-1, x);
  60.   devoileCase(tableauJeu, tableauMine, y, x-1);
  61.  }
  62.  else
  63.  {
  64.   devoileCase(tableauJeu, tableauMine, y-1, x-1);
  65.   devoileCase(tableauJeu, tableauMine, y-1, x);
  66.   devoileCase(tableauJeu, tableauMine, y-1, x+1);
  67.   devoileCase(tableauJeu, tableauMine, y, x-1);
  68.   devoileCase(tableauJeu, tableauMine, y, x+1);
  69.   devoileCase(tableauJeu, tableauMine, y+1, x-1);
  70.   devoileCase(tableauJeu, tableauMine, y+1, x);
  71.   devoileCase(tableauJeu, tableauMine, y+1, x+1);
  72.  }
  73. }
  74. if(tableauMine[y][x] == 1) tableauJeu[y][x] = '1';
  75. if(tableauMine[y][x] == 2) tableauJeu[y][x] = '2';
  76. if(tableauMine[y][x] == 3) tableauJeu[y][x] = '3';
  77. if(tableauMine[y][x] == 4) tableauJeu[y][x] = '4';
  78. if(tableauMine[y][x] == 5) tableauJeu[y][x] = '5';
  79. if(tableauMine[y][x] == 6) tableauJeu[y][x] = '6';
  80. if(tableauMine[y][x] == 7) tableauJeu[y][x] = '7';
  81. if(tableauMine[y][x] == 8) tableauJeu[y][x] = '8';
  82. if(tableauMine[y][x] == 9) tableauJeu[y][x] = '9';
  83. }

mood
Publicité
Posté le 14-12-2009 à 00:29:38  profilanswer
 

n°1950103
olivthill
Posté le 14-12-2009 à 13:45:22  profilanswer
 

Le problème vient d'appels qui n'en finissent plus, et finissent par faire déborder la pile.
Par exemple, pour x = 0, y=0, il y a :

if(x == 0 && y == 0)
 {
   devoileCase(tableauJeu, tableauMine, y+1, x);  
 
// On a donc y=1, x=0, puis
 
 else if(x == 0 && (y > 0 && y < TAILLE))
 {
   devoileCase(tableauJeu, tableauMine, y-1, x);
 
// On a donc y=0, x=0, et on repart comme avant indéfiniment


n°1950280
-umibozu-
Posté le 14-12-2009 à 19:56:55  profilanswer
 

Ok mais comment faire pour éviter ça ??

n°1950294
tpierron
Posté le 14-12-2009 à 21:22:22  profilanswer
 

La logique de ta fonction devoileCase est un peu foireuse. Utilise plutôt un algo du genre :

  • À l'appel de la fonction, marque la case (x, y) comme dévoilé.
  • Fait une itération sur les 8 cases avoisinantes (en faisant attention de ne pas sortir de la matrice, donc pas de pillule rouge) et appelle devoileCase() uniquement si la case n'est pas dévoilée.


Pouf, au lieu de 85 lignes, tu en auras plus qu'une vingtaine, et un seg fault en moins.


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  Démineur erreur de segmentation

 

Sujets relatifs
[PHP/Access] Erreur ODBCErreur de compilation Java "cannot find symbol" sous ubuntu 9.04
[c] erreur de segmentationEmpecher l'erreur lors du chargement du XML
Erreur mysql : corrupted double-linked listBug Visual Basic : impossible de voir la ligne de l'erreur
Internet Explorer : erreur de syntaxe ligne 4Erreur 1064 Mysql
Message d'erreur (math domain error) 
Plus de sujets relatifs à : Démineur erreur de segmentation


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR