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

  FORUM HardWare.fr
  Programmation
  C

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°2279564
laenthis
Posté le 15-04-2016 à 18:22:10  profilanswer
 

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
mood
Publicité
Posté le 15-04-2016 à 18:22:10  profilanswer
 

n°2279565
Farian
Posté le 15-04-2016 à 18:31:48  profilanswer
 

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 !
n°2279566
laenthis
Posté le 15-04-2016 à 18:35:10  profilanswer
 

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.

n°2279567
Farian
Posté le 15-04-2016 à 18:39:43  profilanswer
 

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 !
n°2279568
laenthis
Posté le 15-04-2016 à 18:42:47  profilanswer
 

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

n°2279569
rat de com​bat
attention rongeur méchant!
Posté le 15-04-2016 à 19:37:36  profilanswer
 

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

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

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

 

Sujets relatifs
[C#]Problème de droit d'accès, Outil de rechercheEviter les quotes quand j'insère du texte dans un tableau
Les meilleurs livres pour un novice total en C++ ?LANGAGE C : MAC FLOODING
Insérer une image dans un tableau HTML envoyée par sendmail[VBA] Utilisation du solver avec des fonctions code en vba???
Traduction d'un programme C en pythonOù, comment et sur quel OS apprendre le C++ ?
[PHP/Bootstrap] Problème de pièce jointe et d'envoi de donnéesrecherche dans un tableau.
Plus de sujets relatifs à : C : Envoi et retour d'un tableau dans des fonctions.


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