C : Envoi et retour d'un tableau dans des fonctions.

C : Envoi et retour d'un tableau dans des fonctions. - C - Programmation

Marsh Posté le 15-04-2016 à 18:22:10    

Bonjour à tous, ça fait 3 heures que j'erre sur le net pour trouver une réponse à mon problème, mais devant 6 alternatives différentes qui ne répondent jamais correctement à mes besoins, je me tourne vers vous.
 
Je suis en train de coder un sudoku, et j'ai besoin de faire passer une grille initialisée à 0 (un tableau bi dimensionnel en somme) en paramètre à une fonction qui va la remplir avec des nombres. Mais, j'ai de monstrueux problème de syntaxe, je ne sais pas comment gérer tableaux et fonctions ensemble ainsi que le retour.
 
Voici mon code :  
 

Code :
  1. int TestCarre(int *grille, int x, int y, int valeur)    #Cette fonction et les deux qui suivent sont des tests pour savoir si les valeurs générée en random plus loin correspondent aux critères d'un sudoku.
  2. {
  3.     int c = x/3;
  4.     c = c*3;
  5.     int d = y/3;
  6.     d = d*3;
  7.     int i;
  8.     int j;
  9.     int validite;
  10.     for(i=c;i<c+3;i++)
  11.     {
  12.         for(j=d;j<d+3;j++)
  13.         {
  14.             if(valeur == grille[c][d])
  15.             {
  16.                 validite = 1;
  17.                 if (i != x && j != y)
  18.                 {
  19.                 return validite;
  20.                 }
  21.             }
  22.             else
  23.             {
  24.                 validite =2;
  25.             }
  26.         }
  27.     }
  28.     return validite;
  29. }
  30. int TestLigne(int *grille, int x, int y, int valeur)
  31. {
  32.     int i;
  33.     int validite = 0;
  34.     for(i=0;i<9;i++)
  35.     {
  36.         if (valeur == grille[x][i])
  37.         {
  38.             validite = 1;
  39.             if (i != y)
  40.             {
  41.             return validite;
  42.             }
  43.         }
  44.         else
  45.         {
  46.             validite = 2;
  47.         }
  48.     }
  49.     return validite;
  50. }
  51. int TestColonne(int *grille, int x, int y, int valeur)
  52. {
  53.     int i;
  54.     int validite;
  55.     for(i=0;i<9;i++)
  56.     {
  57.         if (valeur == grille[i][y])
  58.         {
  59.             validite = 1;
  60.             if (i != x)
  61.             {
  62.             return validite;
  63.             }
  64.         }
  65.         else
  66.         {
  67.             validite = 2;
  68.         }
  69.     }
  70.     return validite;
  71. }
  72. int Plateau(int *grille)       #La fonction qui doit remplir la grille.
  73. {
  74.     int i;
  75.     int j;
  76.     int r;
  77.     int colonne;
  78.     int ligne;
  79.     int carre;
  80.     for(i=0;i<9;i++)
  81.     {
  82.         for(j=0;j<9;j++)
  83.         {
  84.             roll:
  85.             {
  86.                 r = rand()%9 + 1;
  87.                 grille[i][j] = r;
  88.                 printf("%i", r);
  89.                 colonne = TestColonne(grille,i,j,r);
  90.                 ligne = TestLigne(grille,i,j,r);
  91.                 carre = TestCarre(grille,i,j,r);
  92.                 if(colonne == 1 || carre == 1 || ligne == 1)
  93.                 {
  94.                     printf("Probleme" );
  95.                     goto roll;
  96.                 }
  97.             }
  98.         }
  99.     }
  100. }
  101. int main()
  102. {
  103.     int grille[9][9] = {{0,0,0,0,0,0,0,0,0}
  104.                         ,{0,0,0,0,0,0,0,0,0}
  105.                         ,{0,0,0,0,0,0,0,0,0}
  106.                         ,{0,0,0,0,0,0,0,0,0}
  107.                         ,{0,0,0,0,0,0,0,0,0}
  108.                         ,{0,0,0,0,0,0,0,0,0}
  109.                         ,{0,0,0,0,0,0,0,0,0}
  110.                         ,{0,0,0,0,0,0,0,0,0}
  111.                         ,{0,0,0,0,0,0,0,0,0}};
  112.     int j;
  113.     int i;
  114.     for(i=0;i<9;i++)
  115.     {
  116.         for(j=0;j<9;j++)
  117.             {
  118.                 printf("%i", grille[i][j]);
  119.             }
  120.         printf("\n" );
  121.     }
  122.     Plateau(grille);
  123.     for(i=0;i<9;i++)
  124.     {
  125.         for(j=0;j<9;j++)
  126.             {
  127.                 printf("%d", grille[i][j]);
  128.             }
  129.         printf("\n" );
  130.     }
  131. }


Message édité par laenthis le 15-04-2016 à 18:35:49
Reply

Marsh Posté le 15-04-2016 à 18:22:10   

Reply

Marsh Posté le 15-04-2016 à 18:31:48    

Bonjour !  
 
Les tableaux à deux dimensions sont toujours un peu problématiques à gérer et à passer, en effet, car cela dépend de la façon dont vous l'allouez (soit int **toto, soit int * toto[], soit int toto[][], même si, de mémoire, les deux dernières sont équivalentes (pas taper si je me trompe :) ).
 
Le plus simple, si vous voulez vraiment travailler en C, est d'utiliser un tableau simple, dans lequel vous rangez les données ligne par ligne (ou colonne par colonne, c'est votre choix :) )
 
Au lieu d'utiliser tab2D[x][y] vous utilisez tab1D[x+nX*y] où nX est le nombre de colonnes (marche aussi avec tab1D[y+nY*x] en utilisant le nombre de lignes, l'important est d'être cohérent).
 
Bonne continuation !


---------------
On n'est jamais très fort pour ce calcul !
Reply

Marsh Posté le 15-04-2016 à 18:35:10    

Le problème ce que je ne peux pas me passer des deux dimensions ici et que chaque fois que je tente de changer la syntaxe, cela a des répercussions hasardeuses que je ne sais pas gérer.

Reply

Marsh Posté le 15-04-2016 à 18:39:43    

Je conteste : vous pouvez vous passer de la deuxième dimension : il faut juste faire les ajustements nécessaires.
 
Au pire, faites deux fonctions : int getElement(vecteur, x, y) et void setElement(vecteur, x, y, valeur) pour les accès, et cela sera nettement plus simple à manipuler (et plus facile à modifier par la suite si nécessaire).
 
Bonne continuation !


---------------
On n'est jamais très fort pour ce calcul !
Reply

Marsh Posté le 15-04-2016 à 18:42:47    

Navré, mais ce n'est pas spécialement un choix personnel. C'est un travail imposé avec quelques conditions.

Reply

Marsh Posté le 15-04-2016 à 19:37:36    

J'ai pas regardé le code en détail, ci-joint un exemple pour les tableaux. Le secret si on peut dire c'est qu'il faut indiquer les dimensions (de préférence avec des #define pour que ça reste cohérent en cas de changement).

 
Code :
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. void func(int g[9][9])
  4. {
  5.     g[0][2]=3;
  6. }
  7. int main(void)
  8. {
  9.     int grille[9][9] = {{0,0,0,0,0,0,0,0,0}
  10.                         ,{0,0,0,0,0,0,0,0,0}
  11.                         ,{0,0,0,0,0,0,0,0,0}
  12.                         ,{0,0,0,0,0,0,0,0,0}
  13.                         ,{0,0,0,0,0,0,0,0,0}
  14.                         ,{0,0,0,0,0,0,0,0,0}
  15.                         ,{0,0,0,0,0,0,0,0,0}
  16.                         ,{0,0,0,0,0,0,0,0,0}
  17.                         ,{0,0,0,0,0,0,0,0,0}};
  18.     func(grille);
  19.    
  20.     printf("%d", grille[0][2]);
  21.     return 0;
  22. }
 

edit: Se passer de la deuxième dimension c'est un mauvais bricolage pour ceux qui ne savent pas faire, à éviter. Si le language C permets des tableaux à plusieurs dimensions alors autant s'en servir si ça a du sens!

 

edit2: Une fonction qui ne retourne rien (Plateau()) doit être déclarée void Plateau(...), sinon le compilateur va râler "warning: control reaches end of non-void function [-Wreturn-type]".
Et le goto c'est moche. :o

Code :
  1. for(j=0;j<9;j++)
  2. {
  3.     do
  4.     {
  5.         r = rand()%9 + 1;
  6.         grille[i][j] = r;
  7.         printf("%i", r);
  8.         colonne = TestColonne(grille,i,j,r);
  9.         ligne = TestLigne(grille,i,j,r);
  10.         carre = TestCarre(grille,i,j,r);
  11.         if(colonne == 1 || carre == 1 || ligne == 1)
  12.         {
  13.             printf("Probleme" );
  14.         }
  15.     } while(colonne == 1 || carre == 1 || ligne == 1);
  16. }



Message édité par rat de combat le 15-04-2016 à 19:46:38
Reply

Sujets relatifs:

Leave a Replay

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