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

  FORUM HardWare.fr
  Programmation
  C

  Problèmes avec un tableau à 2 dimensions

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Problèmes avec un tableau à 2 dimensions

n°1930888
nicodu95
Posté le 10-10-2009 à 21:28:33  profilanswer
 

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)

...

mood
Publicité
Posté le 10-10-2009 à 21:28:33  profilanswer
 

n°1930903
Joel F
Real men use unique_ptr
Posté le 10-10-2009 à 22:40:43  profilanswer
 

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

n°1930906
nicodu95
Posté le 10-10-2009 à 22:57:45  profilanswer
 

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:

n°1930910
regexp42
Eplucheur de RFC.
Posté le 11-10-2009 à 00:04:30  profilanswer
 

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.

n°1930915
nicodu95
Posté le 11-10-2009 à 00:46:50  profilanswer
 

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

n°1930963
nicodu95
Posté le 11-10-2009 à 13:04:00  profilanswer
 

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


Message édité par nicodu95 le 11-10-2009 à 13:04:12
n°1930973
nicodu95
Posté le 11-10-2009 à 14:47:34  profilanswer
 

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

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

  Problèmes avec un tableau à 2 dimensions

 

Sujets relatifs
Macro excel interrogeant un tableau par le nom de la colonneCopier le Paragraphe donc le si son tableau contien OK dans un fichier
bizarre equivalence pointeur /tableau !!!Copier un paragraphe sur une autre page Word si le tableau contien TOT
Tableau contenant php ou tableau en phpRésolu : Récupérer le nom d'un tableau dynamique sous Excel2007
VBA - excel - Tableau croisé dynamique - grouper...[Résolu] Macro excel pour tri tableau par semaine
créer un tableau d'images cliquables sans espaces 
Plus de sujets relatifs à : Problèmes avec un tableau à 2 dimensions


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