Problèmes avec un tableau à 2 dimensions

Problèmes avec un tableau à 2 dimensions - C - Programmation

Marsh Posté le 10-10-2009 à 21:28:33    

Bonjour à tous,
 
Comme l'indique le titre, j'ai un petit problème avec les tableaux à 2 dimensions. Mon tableau est défini tel quel :

Code :
  1. int grill[81][13];


 
J'ai 3 fonctions qui font des opérations sur ce tableau. Les 2 premières marchent très bien. La troisième renvoie un seg fault :/ Enfait dans aucune des 3 fonctions la structure du tableau est modifié. Des valeurs sont chargés dans ce tableau dans le main() et les fonctions ne modifient que ces valeurs. Ne comprenant pas d'où ça vient, j'ai investigué avec GDB.
 
J'ai grill qui est à l'adresse 0x7fff41d2b428; grill[cell] (cell=0) à l'adresse 0x7fff41d2b7e0 et grill[cell][0] à l'adresse 0x100000001  :cry:  
 
Si quelqu'un sait comment ça se fait...
 
Merci d'avance.
 
PS : mon opinion personnelle sur tout ça est qu'un bout du tableau est perdu en route. Le seg fault se fait sur un

Code :
  1. if(grill[cell][3]==1)

...

Reply

Marsh Posté le 10-10-2009 à 21:28:33   

Reply

Marsh Posté le 10-10-2009 à 22:40:43    

ton opinion, elle vaut pas 1cents. Les tableaux ne se perdent pas en route. Je parie plus sur un cell dont la valeur depasse la taille du tableaux.
 
Ensuite, voila la bonne manière de gérer des tableaux 2D:
 
http://codepad.org/K2WAwRBP

Reply

Marsh Posté le 10-10-2009 à 22:57:45    

je sais qu'elle vaut rien mon opinion ^^
 Ce que je comprend pas c'est que si je fait afficher ma grille la ligne d'avant tout marche, et la ligne d'après ça bug. Y a aucune raison...  
 

Code :
  1. printGrill(grill); // là ça marche
  2. if(grill[cell][3]==1) { continue; } //là ça marche plus


 
sachant que :
 

Code :
  1. void printGrill(int grill[][13])
  2.       {
  3.        int i, j, k;
  4.        printf("-------------------------------------\n" );
  5.        k=0;
  6.        for(i=0;i<9;i++)
  7. {
  8.  for(j=0;j<9;j++)
  9.   {
  10.    switch(grill[k][3])
  11.     {
  12.      case 0 : printf("| 0 " ); break;
  13.      case 1 : printf("| %d ", grill[k][4]); break;
  14.     }
  15.    k++;
  16.   }
  17.  printf("|\n-------------------------------------\n" );
  18. }
  19.        printf("\n\n\n" );
  20.       }


 
 
 :cry:

Reply

Marsh Posté le 11-10-2009 à 00:04:30    

nicodu95 a écrit :

Code :
  1. if(grill[cell][3]==1) { continue; } //là ça marche plus



 
Tu cherches à ne rien faire là ? Si oui, il ne faut pas coder de ligne pour ça.
 

nicodu95 a écrit :


Code :
  1. switch(grill[k][3])
  2.     {
  3.      case 0 : printf("| 0 " ); break;
  4.      case 1 : printf("| %d ", grill[k][4]); break;
  5.     }




 
Tu devrais mettre des warnings, que se passe-t-il si grill[k][3] vaut 2 ?
De plus tu peux faire plus simple :
 

Code :
  1. printf("| %d", grill[k][3] ? grill[k][4] : 0);


 
Globalement ça semble assez brumeux ton truc, si tu pouvais poster plus de code et expliquer ce que tu cherches à faire, ça serait pas mal.

Reply

Marsh Posté le 11-10-2009 à 00:46:50    

regexp42 a écrit :


 
Tu cherches à ne rien faire là ? Si oui, il ne faut pas coder de ligne pour ça.
 
Enfait c'est dans une grosse boucle, et ça me sert à trier les cellules que je veut.
 


 

regexp42 a écrit :


 
Tu devrais mettre des warnings, que se passe-t-il si grill[k][3] vaut 2 ?
grill[k][3] ne vaut jamais 2
De plus tu peux faire plus simple :
 

Code :
  1. printf("| %d", grill[k][3] ? grill[k][4] : 0);


 
Merci pour l'astuce :)
 
Globalement ça semble assez brumeux ton truc, si tu pouvais poster plus de code et expliquer ce que tu cherches à faire, ça serait pas mal.
 
 


 
Donner plus de code ne servirait à rien, mais bon ^^
 

Code :
  1. for(zone_type=0;zone_type<3;zone_type++)
  2. {
  3.  for(zone=0;zone<9;zone++)
  4.   {
  5.    for(cell=0;cell<81;cell++)
  6.     {
  7.              printGrill(grill);
  8.              if(grill[cell][3]==1) { continue; }
  9.             }
  10.           }
  11.         }


 
Enfait je veut juste savoir pourquoi ma grille s'affiche ligne 7 (ce qui prouve son intégrité) et pourquoi ça seg fault ligne 8. J'arrive pas à le concevoir ^^ Surtout qu'en plus jfait ce genre de test plein plein de fois ailleurs dans le programme, avec exactement la MEME grille, et ça seg fault nul part...
 

Reply

Marsh Posté le 11-10-2009 à 13:04:00    

Personne n'a d'idée ?  :heink:


Message édité par nicodu95 le 11-10-2009 à 13:04:12
Reply

Marsh Posté le 11-10-2009 à 14:47:34    

J'ai trouvé d'où ça venait :
Ma fonction avait comme prototype :

Code :
  1. void function(int **grill);


 
Au lieu de :
 
 

Code :
  1. void function(int grill[][13]);


 
 :sweat:


Message édité par nicodu95 le 11-10-2009 à 14:47:45
Reply

Sujets relatifs:

Leave a Replay

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