Probleme avec un pointeur

Probleme avec un pointeur - C - Programmation

Marsh Posté le 25-04-2010 à 17:55:17    

Salut
 
Voila j'ai fais une fonction qui compare le nombre entré avec le nombre mystère en demandant a la fin si on veut continuer, alors pour ça j'ai déclaré un pointeur qui pointe sur la variable continuer qui se trouve dans le main, mais hélas ça fonctionne pas.. pourquoi?
 
La fonction compare :
 

Code :
  1. void compareNbrG(int nbrMystere)
  2. {
  3.     int nbrE, continuer = 0,*ptr = NULL;
  4.     do
  5.     {
  6.         printf("Quel est le nombre Mystere ? " );
  7.         scanf("%d", &nbrE);
  8.         if (nbrE < nbrMystere)
  9.             printf("C'est plus ++ !\n" );
  10.         else if (nbrE > nbrMystere)
  11.             printf("C'est moins -- !\n" );
  12.         else
  13.         {
  14.             printf("Bravo !! C'est bien le nombre Mystere !!\n\n" );
  15.             printf("Voulez vous continuer ?\n1. YES\n0. NO\n\n  " );
  16.             scanf("%d", &continuer);
  17.             if (continuer == 1)
  18.             {
  19.                 ptr = &continuer;
  20.                 *ptr = 1;
  21.             }
  22.             else if (continuer == 0)
  23.             {
  24.                 ptr = &continuer;
  25.                 *ptr = 0;
  26.             }
  27.         }
  28.     }
  29.     while (nbrE != nbrMystere);
  30. }


Reply

Marsh Posté le 25-04-2010 à 17:55:17   

Reply

Marsh Posté le 25-04-2010 à 18:01:07    

1/ Dans le code que tu donnes, ptr pointe vers le continuer de compareNbrG().
2/ Que se passe-t'il si on rentre qqch d'autre que 0 ou 1?


---------------
The truth is rarely pure and never simple (Oscar Wilde)
Reply

Marsh Posté le 25-04-2010 à 18:13:28    

Citation :

ça fonctionne pas

Qu'est-ce qui ne marche pas ? Il y a un plantage ? un message d'erreur à lacompilation ? autre chose ?

if (continuer == 1)
            {
                ptr = &continuer;
                *ptr = 1;
            }

Que fait ce code ? Remplaçons continuer par Sarkozy et ptr par adresse de Fillon. Comme on le sait, Sarkozy habite à l'Elisée, et on va dire qu'il y a un beau vase là bas. Le programme change l'adresse de Fillon. Il n'est plus à Matignon, mais à l'Elysée. Puis à cette nouvelle adresse, on y met un beau vase. Mais il était déjà là. Alors, c'est comme si on n'avait rien fait.
 
N.B. Il faut choisir de meilleurs noms pour ces variables. Généralement, on combine une description du contenu avec un code pour le type de contenu. Par exemple, au lieu de continuer et ptr, on peut chosir ContinuerFlag, ContinuerPtr.


Message édité par billgatesanonym le 25-04-2010 à 18:15:03
Reply

Marsh Posté le 25-04-2010 à 20:41:35    

Citation :

    int nbrE, continuer = 0,*ptr = NULL;


Tu déclares une variable locale (a la procédure) nommée continuer. Cette variable va donc masquer la variable continuer déclarée dans main.

 

Ce que tu aurais du faire:

 

Soit:
Déclaration
void compareNbrG(int nbrMystere, int *cont)
{
   int nbrE, *ptr = NULL;
   *cont = 0;
......................
Appel:
void compareNbrG(xxx, &continuer);

 

Ou bien (ce me semblerait bien plus logique):
Déclaration
int compareNbrG(int nbrMystere)
{
  int nbrE, continuer = 0,*ptr = NULL;
.................
return continuer;
}
..........................
Appel:
continuer = compareNbrG(xxx);

 

A+,

 



Message édité par gilou le 25-04-2010 à 20:42:08

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 26-04-2010 à 11:03:50    

Merci, mais je crois que vous avez pas compris ce que je voulais dire, car a la fin de la fonction compare je veux retourné dans le main avec la valeur de "continuer changer" pour pouvoir faire la boucle jusqu'au menu..
 
Voici mon main :
 

Code :
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <time.h>
  4. int main()
  5. {
  6.     int choixNiveau,nbrM,nbrM1,nbrJoueurs,continuer = 0,compteur = 1,MIN = 0,MAX = 0;
  7.     printf("\t\t\t\tBIENVENU AU PLUS OU MOINS\n\n" );
  8.     printf("\t*MENU*\n\n" );
  9.     printf("1. Niveau entre 1 et 10\n" );
  10.     printf("2. Niveau entre 1 et 20\n" );
  11.     printf("3. Niveau entre 1 et 50\n" );
  12.     printf("4. Niveau entre 1 et 100\n\n" );
  13.     printf("\t*JOUEUR*\n\n" );
  14.     printf("1. Jouer seul\n" );
  15.     printf("2. Jouer a 2\n\n" );
  16.     do
  17.     {
  18.         srand(time(NULL));
  19.         do
  20.         {
  21.             printf("Quel niveau choisissez vous ? " );
  22.             scanf("%d", &choixNiveau);
  23.             if (choixNiveau < 1 || choixNiveau > 4)
  24.                 printf("Choix incorrect !!!" );
  25.         }
  26.         while (choixNiveau < 1 || choixNiveau > 4);
  27.         do
  28.         {
  29.             printf("\nQuel est le nombre de joueurs ? " );
  30.             scanf("%d", &nbrJoueurs);
  31.             if (nbrJoueurs < 1 || nbrJoueurs > 2)
  32.                 printf("Choix incorrect !!!" );
  33.         }
  34.         while (nbrJoueurs < 1 || nbrJoueurs > 2);
  35.         switch (choixNiveau)
  36.         {
  37.         case 1:
  38.             printf("\nVous avez choisi le Niveau 1 : entre 1 et 10 !\n\n" );
  39.             MIN = 1;
  40.             MAX = 10;
  41.             break;
  42.         case 2:
  43.             printf("\nVous avez choisi le Niveau 2 : entre 1 et 20 !\n\n" );
  44.             MIN = 1;
  45.             MAX = 20;
  46.             break;
  47.         case 3:
  48.             printf("\nVous avez choisi le Niveau 3 : entre 1 et 50 !\n\n" );
  49.             MIN = 1;
  50.             MAX = 50;
  51.             break;
  52.         case 4:
  53.             printf("\nVous avez choisi le Niveau 4 : entre 1 et 100 !\n\n" );
  54.             MIN = 1;
  55.             MAX = 100;
  56.             break;
  57.         default:
  58.             printf("\nChoix incorrect !!!\n\n" );
  59.             break;
  60.         }
  61.         if (choixNiveau == 1)
  62.         {
  63.             nbrM = (rand() % (MAX - MIN + 1)) + MIN;
  64.             compteur = 1;
  65.             compareNbrG(nbrM);
  66.         }
  67.         printf("Continuer vaut : %d" , continuer);
  68.         if (choixNiveau ==2)
  69.         {
  70.             printf("Quel est le nombre Mystere a trouve ? " );
  71.             scanf("%d", &nbrM1);
  72.             compteur = 1;
  73.             system("cls" );
  74.             compareNbrT(nbrM1);
  75.         }
  76.     }
  77.     while (continuer);
  78.     return 0;
  79. }


 
voici mes fonctions :
 

Code :
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <time.h>
  4. #include "fonction.h"
  5. void compareNbrG(int nbrMystere)
  6. {
  7.     int nbrE, continuer = 0,*ptr = NULL;
  8.     do
  9.     {
  10.         printf("Quel est le nombre Mystere ? " );
  11.         scanf("%d", &nbrE);
  12.         if (nbrE < nbrMystere)
  13.             printf("C'est plus ++ !\n" );
  14.         else if (nbrE > nbrMystere)
  15.             printf("C'est moins -- !\n" );
  16.         else
  17.         {
  18.             printf("Bravo !! C'est bien le nombre Mystere !!\n\n" );
  19.             printf("Voulez vous continuer ?\n1. YES\n0. NO\n\n  " );
  20.             scanf("%d", &continuer);
  21.             if (continuer == 1)
  22.             {
  23.                 ptr = &continuer;
  24.                 *ptr = 1;
  25.             }
  26.             else if (continuer == 0)
  27.             {
  28.                 ptr = &continuer;
  29.                 *ptr = 0;
  30.             }
  31.         }
  32.     }
  33.     while (nbrE != nbrMystere);
  34. }
  35. void compareNbrT(int nbrMystere1)
  36. {
  37.     int nbrE,continuer = 0,*ptr = NULL;
  38.     do
  39.     {
  40.         printf("Quel est le nombre Mystere ? " );
  41.         scanf("%d", &nbrE);
  42.         if (nbrE < nbrMystere1)
  43.             printf("C'est plus ++ !\n" );
  44.         else if (nbrE > nbrMystere1)
  45.             printf("C'est moins -- !\n" );
  46.         else
  47.         {
  48.             printf("Bravo !! C'est bien le nombre Mystere !!\n\n" );
  49.             printf("Voulez vous continuer ?\n1. YES\n2. NO\n\n  " );
  50.             scanf("%d", &continuer);
  51.             if (continuer == 1)
  52.             {
  53.                 ptr = &continuer;
  54.                 *ptr = 1;
  55.             }
  56.             else if (continuer == 0)
  57.             {
  58.                 ptr = &continuer;
  59.                 *ptr = 0;
  60.             }
  61.         }
  62.     }
  63.     while (nbrE != nbrMystere1);
  64. }

Reply

Marsh Posté le 26-04-2010 à 13:03:33    

Citation :

Merci, mais je crois que vous avez pas compris ce que je voulais dire, car a la fin de la fonction compare je veux retourné dans le main avec la valeur de "continuer changer" pour pouvoir faire la boucle jusqu'au menu..

Si, j'ai parfaitement compris ce que tu dis, la c'est toi qui n'a pas compris les explications.
La variable continuer de main ne sera pas modifiée par les appels a compareNbrG et compareNbrT parce que dans compareNbrG  la variable continuer de main est masquée par la variable continuer de compareNbrG et que dans compareNbrT  la variable continuer de main est masquée par la variable continuer de compareNbrT.
 
C'est pas comme tu as voulu faire qu'on fait (tu as essayé d'utiliser continuer comme variable globale, c'est pas une mauvaise idée [si tout était dans un seul fichier, et que tu supprimais   les définitions de continuer dans compareNbrG et compareNbrT, ça pourrait marcher], sauf que ça cause beaucoup trop de problèmes a la longue, les variables globales, et c'est une habitude qu'il ne faut pas prendre). Je t'ai indiqué dans mon post précédent comment remédier a ton pb.
 
A+,

Message cité 1 fois
Message édité par gilou le 26-04-2010 à 13:04:43

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 26-04-2010 à 15:24:44    

gilou a écrit :

Je t'ai indiqué dans mon post précédent comment remédier a ton pb.


Faudrait déjà qu'il les lise (et pas en diagonale) [:ocube]

Reply

Marsh Posté le 26-04-2010 à 15:39:49    

Merci gilou c'est compris...

Reply

Sujets relatifs:

Leave a Replay

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