[Résolu]Variable modifié entre deux fonctions

Variable modifié entre deux fonctions [Résolu] - C - Programmation

Marsh Posté le 10-02-2013 à 11:07:44    

Bonjour a tous et a toutes je suis actuellement en train de faire un 'Jeu de la vie' pour un devoir.
je rentre mes fonction notamment une pour la création d'un tableau dynamique mais entre 2 fonctions mes valeurs changent sans que (ré)assigne les variables.
 
exemple ma hauteur je la met a 9 longueur aussi a 9
 et bien quand je l'affiche elle passe a 2686720 pour la hauteur et 2686716 pour la longueur et ce peu importe le nombre que je met dans la variable
 
http://puu.sh/20hjU
 
Avez vous une idée de ce qu'il se passe a mes variable ?
 
Mon Main:

Code :
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include "Autoheader.h"
  4. int main()
  5. {
  6. int **plateau;
  7. int hauteur = 0;
  8. int longueur = 0;
  9. int B[9];
  10. int S[9];
  11. int i;
  12. int j;
  13.      dimensionnement(&hauteur,&longueur);
  14. // Declaration Tableau Dynamique
  15. plateau = malloc(hauteur * sizeof(*plateau));
  16. for (i = 0; i < hauteur; i++)
  17. {
  18.     plateau[i] = malloc(longueur * sizeof(**plateau));
  19.     for(j = 0; j < longueur; j++)
  20.     {
  21.         plateau[i][j] = 0;
  22.     }
  23. }
  24.         printf("\t %d \n",hauteur);
  25.         printf("\t %d \n",longueur);
  26.         initialisation(&plateau,&hauteur,&longueur);
  27.         affiche(&plateau,&hauteur,&longueur);
  28.         affiche_fichier(&plateau,&hauteur,&longueur);
  29.         saisie_B_M(&B[9]);
  30.         saisie_S_M(&S[9]);
  31.         nb_generation ();
  32. return 0;
  33. }


 
le .c de mon header

Code :
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include "Autoheader.h"
  4. void dimensionnement(int *hauteur, int *longueur)
  5. {
  6.     printf("Entrez la resolution du plateau de jeu\n" );
  7.     printf("Suivez bien cette regle, il ne peut y avoir une resolution negative\n\n" );
  8.     //boucle pour avoir seulement une valeur sup a 1
  9.     do
  10.     {
  11.         printf("Inscrivez la hauteur du tableau (nombres de Lignes) :\t" );
  12.         scanf("%d", hauteur);
  13.     }
  14.     while (0 > hauteur);
  15.     do
  16.     {
  17.     printf("Inscrivez la longueur du tableau (nombres de Colones) :\t" );
  18.     scanf("%d", longueur);
  19.     }
  20.     while (0 > longueur);
  21.     printf("\n\n" );
  22. }
  23. void initialisation(int **plateau,int hauteur,int longueur)
  24. {
  25. int h = hauteur;
  26. int l = longueur;
  27. int celluleactive;
  28. int comp_cellule_for;
  29. int buffer_activation_h;
  30. int buffer_activation_l;
  31.         printf("\t %d \n",hauteur);
  32.         printf("\t %d \n",longueur);
  33.         printf("\t %d \n",h);
  34.         printf("\t %d \n",l);
  35.     printf("Veuillez entrer le nombre de celules vivantes dans la 1ere generation :\t" );
  36.     scanf("%d", &celluleactive);
  37.     for(comp_cellule_for = 0; comp_cellule_for < celluleactive; comp_cellule_for++)
  38.     {
  39.         printf("%d", h);
  40.         do // coordonées de la cellule en hauteur
  41.         {
  42.             do
  43.             {
  44.                 printf("A quelle ligne se trouve la cellule a activer ? :\t" );
  45.                 scanf("%d",&buffer_activation_h);
  46.             }
  47.             while (buffer_activation_h < 0);
  48.         }
  49.         while (buffer_activation_h > hauteur);
  50.         do // coordonées de la cellule en longueur
  51.         {
  52.             do
  53.             {
  54.                 printf("A quelle colonne se trouve la cellule a activer ? :\t" );
  55.                 scanf("%d", &buffer_activation_l);
  56.             }
  57.             while (buffer_activation_l < 0);
  58.         }
  59.         while (buffer_activation_l > longueur);
  60.     plateau[--buffer_activation_h][--buffer_activation_l] = 1;
  61.     }
  62. }
  63. int nb_generation(nb_gene)
  64. {
  65.         do
  66.         {
  67.         printf("Veuillez entrez le nombre de generation desire \n" );
  68.         printf("il ne peut etre inferieur a 0\n" );
  69.         scanf("%d", &nb_gene);
  70.         }
  71.         while (nb_gene <= 0 );
  72. printf("\n\n" );
  73. }
  74. void affiche(int**plateau,int hauteur, int longueur)
  75. {
  76. int ia;
  77. int ja;
  78.     for(ia=0;ia < hauteur;ia++)
  79.     {
  80.         for(ja=0; ja < longueur;ja++)
  81.         {
  82.             if (plateau[ia][ja]==1)
  83.             {
  84.                 printf("o" ); //affiche des 'o' a la place des '1' du plateau
  85.             }
  86.             else
  87.             {
  88.                 printf("." ); //affiche des '.' a la place des '0' du plateau
  89.             }
  90.         }
  91.     }
  92. printf("\n\n" );
  93. }
  94. void affiche_fichier(int** plateau, int hauteur, int longueur)
  95. {
  96.     int i,j;
  97.     FILE * resultat = NULL;
  98.     resultat = fopen("F:\\AutoMath\\Automath.txt","w+" );
  99.     if (resultat != NULL) //Verification de l'ouverture
  100.     {
  101.         printf ("Le fichier Automath.txt a reussi son ouverture\n" );//Succes
  102.         for(j=0;j<hauteur;j++)
  103.         {
  104.             for (i=0;i<longueur;i++)
  105.             {
  106.                 if(plateau[i][j]==1)
  107.                     fputc('o', resultat);
  108.                 else
  109.                     fputc('.', resultat);
  110.             }
  111.             printf("\n" );
  112.         }
  113.         fclose(resultat);
  114.     }
  115.     else// Echec
  116.     {
  117.         printf("Erreur: Le fichier Automath.txt ne peut s'ouvrir" );
  118.         system("PAUSE" );
  119.     }
  120. printf("\n\n" );
  121. }
  122. void saisie_B_M(int B[9])
  123. {
  124.     int b_moore[9];
  125.     int compteur_moore= 0;
  126.     int choix_moore;
  127.     printf("Veuillez entrez les regles de naissances B \n" );
  128.     printf("N'entrez que des 0 ou des 1 \n" );
  129.     printf("0 = Non\n" );
  130.     printf("1 = Oui\n\n" );
  131.     for(compteur_moore= 0 ;compteur_moore<9; compteur_moore++)
  132.     {
  133.         do
  134.         {
  135.             printf("Une cellule morte ayant %d voisins dois t'elle vivre ? :\t", compteur_moore);
  136.             scanf("%d", &choix_moore);
  137.             b_moore[compteur_moore]=choix_moore;
  138.         }
  139.         while (choix_moore != 0 && choix_moore != 1);
  140.     }
  141. printf("\n\n" );
  142. }
  143. void saisie_S_M(int S[9])
  144. {
  145. int s_moore[9];
  146. int compteur_moore_s= 0;
  147. int choix_moore_s;
  148.     printf("Veuillez entrez les regles de survie S \n" );
  149.     printf("N'entrez que des 0 ou des 1 \n" );
  150.     printf("0 = Non\n" );
  151.     printf("1 = Oui\n\n" );
  152.     for(compteur_moore_s= 0 ;compteur_moore_s<9; compteur_moore_s++)
  153.     {
  154.         do
  155.         {
  156.             printf("Une cellule vivante ayant %d voisins dois t'elle survivre ? :\t", compteur_moore_s);
  157.             scanf("%d", &choix_moore_s);
  158.             s_moore[compteur_moore_s]=choix_moore_s;
  159.         }
  160.         while (choix_moore_s != 0 && choix_moore_s != 1);
  161.     }
  162. printf("\n\n" );
  163. }


 
Mon header

Code :
  1. #ifndef AUTOMATH_H_INCLUDED
  2. #define AUTOMATH_H_INCLUDED
  3. void dimensionnement(int *hauteur, int *longueur);
  4. void initialisation(int **plateau,int hauteur,int longueur);
  5. void affiche(int **plateau,int hauteur,int longueur);
  6. void affiche_fichier(int **plateau, int hauteur, int longueur);
  7. void saisie_B_M(int B[9]);
  8. void saisie_S_M(int S[9]);
  9. int nb_generation ();
  10. #endif // AUTOMATH_H_INCLUDED


 
le compilateur me dit :

Code :
  1. F:\Auto\automath\main.c||In function 'main':|
  2. F:\Auto\automath\main.c|31|warning: passing argument 1 of 'initialisation' from incompatible pointer type [enabled by default]|
  3. F:\Auto\automath\Autoheader.h|5|note: expected 'int **' but argument is of type 'int ***'|
  4. F:\Auto\automath\main.c|31|warning: passing argument 2 of 'initialisation' makes integer from pointer without a cast [enabled by default]|
  5. F:\Auto\automath\Autoheader.h|5|note: expected 'int' but argument is of type 'int *'|
  6. F:\Auto\automath\main.c|31|warning: passing argument 3 of 'initialisation' makes integer from pointer without a cast [enabled by default]|
  7. F:\Auto\automath\Autoheader.h|5|note: expected 'int' but argument is of type 'int *'|
  8. F:\Auto\automath\main.c|32|warning: passing argument 1 of 'affiche' from incompatible pointer type [enabled by default]|
  9. F:\Auto\automath\Autoheader.h|6|note: expected 'int **' but argument is of type 'int ***'|
  10. F:\Auto\automath\main.c|32|warning: passing argument 2 of 'affiche' makes integer from pointer without a cast [enabled by default]|
  11. F:\Auto\automath\Autoheader.h|6|note: expected 'int' but argument is of type 'int *'|
  12. F:\Auto\automath\main.c|32|warning: passing argument 3 of 'affiche' makes integer from pointer without a cast [enabled by default]|
  13. F:\Auto\automath\Autoheader.h|6|note: expected 'int' but argument is of type 'int *'|
  14. F:\Auto\automath\main.c|33|warning: passing argument 1 of 'affiche_fichier' from incompatible pointer type [enabled by default]|
  15. F:\Auto\automath\Autoheader.h|7|note: expected 'int **' but argument is of type 'int ***'|
  16. F:\Auto\automath\main.c|33|warning: passing argument 2 of 'affiche_fichier' makes integer from pointer without a cast [enabled by default]|
  17. F:\Auto\automath\Autoheader.h|7|note: expected 'int' but argument is of type 'int *'|
  18. F:\Auto\automath\main.c|33|warning: passing argument 3 of 'affiche_fichier' makes integer from pointer without a cast [enabled by default]|
  19. F:\Auto\automath\Autoheader.h|7|note: expected 'int' but argument is of type 'int *'|
  20. ||=== Build finished: 0 errors, 9 warnings (0 minutes, 1 seconds) ===|


 
D'avance merci Mimic²


Message édité par Mimic² le 10-02-2013 à 16:16:14
Reply

Marsh Posté le 10-02-2013 à 11:07:44   

Reply

Marsh Posté le 10-02-2013 à 11:25:13    

Code :
  1. do
  2.     {
  3.         printf("Inscrivez la hauteur du tableau (nombres de Lignes) :\t" );
  4.         scanf("%d", hauteur);
  5.     }
  6.     while (0 > hauteur);

Ceci ne fonctionne pas car hauteur est une adresse (pointeur sur un entier). il faut mettre

Code :
  1. do
  2.     {
  3.         printf("Inscrivez la hauteur du tableau (nombres de Lignes) :\t" );
  4.         scanf("%d", hauteur);
  5.     }
  6.     while (0 > *hauteur);

De même pour la longueur.

Reply

Marsh Posté le 10-02-2013 à 11:44:17    

Merci pour ton aide mais j'avais essayé, ça me retourne la même chose
une fois que je met un chiffre même sans le *hauteur il me retourne le bon chiffre.
Une fois que je sort de la fonction je le teste avec un printf et le chiffre est bon je rentre dans la fonction initialisation, la le chiffre a changé

Reply

Marsh Posté le 10-02-2013 à 12:09:45    

Les incohérences sont les suivantes :  
 
Déclaration des variables :

Code :
  1. int **plateau;
  2. int hauteur;
  3. int longueur;


 
Déclaration de la fonction d'initialisation :

Code :
  1. void initialisation(int **plateau,int hauteur,int longueur)


 
Utilisation des variables :  

Code :
  1. initialisation(&plateau,&hauteur,&longueur);


 
Vous passez un triple pointeur au lieu d'un double (pour plateau) et des pointeurs au lieu de valeurs (hauteur, longueur)
 
Note : Les "warnings" du compilateur auraient dû vous mettre la puce à l'oreille :)
 
Edit : En lisant la fin des "warnings", pas besoin de boule de cristal pour prédire que vous allez avoir le même problème avec la fonction "affiche_fichier"


Message édité par Farian le 10-02-2013 à 12:12:14
Reply

Marsh Posté le 10-02-2013 à 12:31:24    

ces fonction sont dans l'énoncé éventuellement ce qui pourrais être faux est :
initialisation(&plateau,&hauteur,&longueur);

Reply

Marsh Posté le 10-02-2013 à 12:52:56    

L'idée est le manque de cohérence entre la déclaration et l'appel.
 
Si la déclaration est fixée, c'est l'appel qui est incorrect, en effet.
 
Globalement, comprendre et, sauf cas particulier, corriger tous les warnings de compilation est nécessaire, le compilateur ne les émet pas par plaisir mais pour indiquer que quelque chose ne va pas.

Reply

Marsh Posté le 10-02-2013 à 16:15:15    

Et bien merci j'ai réussi grâce a vous a trouver le problème en effet il faillait appeler avec :
 
initialisation(plateau,hauteur,longueur);
idem pour les affichages

Reply

Sujets relatifs:

Leave a Replay

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