Démineur erreur de segmentation

Démineur erreur de segmentation - C - Programmation

Marsh Posté le 14-12-2009 à 00:29:38    

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. }

Reply

Marsh Posté le 14-12-2009 à 00:29:38   

Reply

Marsh Posté le 14-12-2009 à 13:45:22    

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


Reply

Marsh Posté le 14-12-2009 à 19:56:55    

Ok mais comment faire pour éviter ça ??

Reply

Marsh Posté le 14-12-2009 à 21:22:22    

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.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed