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

  FORUM HardWare.fr
  Programmation
  C

  [Résolu]Variable modifié entre deux fonctions

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[Résolu]Variable modifié entre deux fonctions

n°2175014
Mimic²
BF3: Badass Under Fire
Posté le 10-02-2013 à 11:07:44  profilanswer
 

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
mood
Publicité
Posté le 10-02-2013 à 11:07:44  profilanswer
 

n°2175015
Trap D
Posté le 10-02-2013 à 11:25:13  profilanswer
 

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.

n°2175016
Mimic²
BF3: Badass Under Fire
Posté le 10-02-2013 à 11:44:17  profilanswer
 

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é

n°2175018
Farian
Posté le 10-02-2013 à 12:09:45  profilanswer
 

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
n°2175022
Mimic²
BF3: Badass Under Fire
Posté le 10-02-2013 à 12:31:24  profilanswer
 

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

n°2175023
Farian
Posté le 10-02-2013 à 12:52:56  profilanswer
 

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.

n°2175058
Mimic²
BF3: Badass Under Fire
Posté le 10-02-2013 à 16:15:15  profilanswer
 

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


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

  [Résolu]Variable modifié entre deux fonctions

 

Sujets relatifs
Macro excel : le nom de variable apparaît dans la formule excelVariable de type texte Access
Impossible de récupérer une variable avec $_GET['id']JS fonctions et variables redéfinies
Transfert d'une variable d'une page à l'autrePython utilisation variable globale
Utilisation .formula "=" & variablecomment connaitre la fin d'un fichier avec des fonctions de bas niveau
Variable %netlogon%récupération d'une variable a l'écriture d'un input
Plus de sujets relatifs à : [Résolu]Variable modifié entre deux fonctions


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