Partage
  • Partager sur Facebook
  • Partager sur Twitter

[C] Problème choix menu

Menu avec choix par chiffres

    11 août 2006 à 22:45:43

    Bonsoir,

    J'ai créé un programme qui gère un total de "donations" (comprenez, c'est pour m'aider dans un jeu (indépendant de ce code)).
    Donc, il a deux fonctions primordiales : voir le total des donations, et ajouter une donation.
    A ce niveau-là, aucun problème. J'ai aussi fais un menu, et c'est là que ça plante.
    Mon menu se présente comme ceci :
    MENU PRINCIPAL - Version x.x
    1. Voir ses donations
    2. Ajouter une donation
    3. Quitter
    Que voulez-vous faire ?

    J'ai passé ce programme à des amis pour qu'ils testent mon programme, et ils me reportent tous la même erreur : quand on tape du texte au lieu d'un chiffre après le "Que voulez-vous faire ?", ça plante : boucle infinie...
    Voici le code entier de la fonction qui affiche le menu :
    void afficherMenu()
    {
       long choixMenuPrincipal = 0;
       do
       {
          printf("MENU PRINCIPAL - Version %s\n", VERSION_PRGM);
          printf("1. Voir ses donations\n");
          printf("2. Ajouter une donation\n");
          printf("3. Quitter\n");
          printf("Que voulez-vous faire ? ");
          scanf("%ld", &choixMenuPrincipal);
          printf("\n");
          if (choixMenuPrincipal == 1)
          {
             afficherDonation();
             choixMenuPrincipal = 0;
          }
          else if (choixMenuPrincipal == 2)
          {
             ajouterDonation();
             choixMenuPrincipal = 0;
          }
       } while (choixMenuPrincipal != 1 && choixMenuPrincipal != 2 && choixMenuPrincipal != 3);
    }


    Comment puis-je enlever cette boucle infinie, et que ça réaffiche le menu principal, comme ça le fait si on écrit n'importe quel nombre..?
    Si nécessaire, demandez la totalité du code, il ne tient que sur une page ;)

    Merci.
    • Partager sur Facebook
    • Partager sur Twitter
      11 août 2006 à 22:57:37

      Tu as oublié la condition "l'utilisateur est un peu bête et ne rendre pas un chiffre entre 1 et 3" dans ta boucle while. Ajoute un

      else
      {printf("Tape un chiffre entre 1 et 3");
      }


      à la fin de ta boucle et ça devrait marcher ^^
      • Partager sur Facebook
      • Partager sur Twitter
        11 août 2006 à 22:59:45

        Par contre, juste une question, quel est l'intêret de passer des paramètres et surtout des pointeurs ? Pourquoi ne déclares tu pas simplement les variables dans ta fonction, sans avoir besoin de pointeurs ?
        • Partager sur Facebook
        • Partager sur Twitter
          11 août 2006 à 23:12:53

          Citation : Léna

          Tu as oublié la condition "l'utilisateur est un peu bête et ne rendre pas un chiffre entre 1 et 3" dans ta boucle while. Ajoute un

          else
          {printf("Tape un chiffre entre 1 et 3");
          }



          à la fin de ta boucle et ça devrait marcher ^^


          J'ai ajouté ta ligne de code après le dernier "else if", et ça ne marche toujours pas :(

          -> Octal : hum bonne question. Je ne maitrise pas trop le C, alors pour l'instant ça marche (sauf ça), mais merci pour ta remarque, ça va y passer dans l'optimisation ^^
          Tiens, je viens de remarquer d'ailleurs que plein de paramètres de fonctions sont inutiles maintenant :lol: Allez op je modifie ça en attendant
          En faite, avant j'avais pas encore implémenté le stockage des données sur fichier texte, donc j'utilisais des pointeurs pour me balader partout :p

          Voilà j'ai optimisé mon code, je l'ai donc modifié sur mon premier message :)
          • Partager sur Facebook
          • Partager sur Twitter
            17 août 2006 à 16:50:03

            Bon j'ai un peu amélioré mon programme (ajout de la gestion du fichier .txt) mais j'ai toujours le même problème, quoi que... il s'est développé partout.
            Je m'explique,
            • Si on entre du texte dans le Choix de menu, ça plante
            • Si on entre du texte dans la fonction Ajouter une donation, ça plante
            • Si on entre du texte dans la Gestion du fichier, ça plante

            Je pense que cela vient du fait que toutes les variables de sélection de la saisie sont des long (long choixMenuPrincipal, long donation, long nouveauContenuFichier...)
            Donc, si on ajoute du texte, c'est incompatible, mais pourquoi ça fait une boucle infinie ? (si je fige, je vois que c'est le menu principal qui tourne en boucle)

            Quelqu'un peut-il m'aider à "débugger" mon programme ? (je considère ça comme un bug, j'imagine pas une boucle infini sur un vieil ordinateur :euh: )
            Merci

            (J'ai édité l'ancien code de mon Menu Principal par le nouveau)
            • Partager sur Facebook
            • Partager sur Twitter
              17 août 2006 à 17:14:26

              Problème de scanf. scanf() est une fonction très capricieuse, il faut l'utiliser avec soin.

              Pour le moment, si tu veux résoudre ton problème, tourne toi vers fgets et sscanf, une couple aussi robuste que simple.

              A+
              Kr00pS
              • Partager sur Facebook
              • Partager sur Twitter
                19 août 2006 à 23:49:52

                Ok merci.

                Sinon quelqu'un pourrait-il m'expliquer comment on utilise ce couple de fonctions ?
                Car niveau fgets, je n'ai trouvé que ce message et je crois que c'est tout :(
                Niveau sscanf... pas grand chose non plus. (à vrai dire rien)
                • Partager sur Facebook
                • Partager sur Twitter
                  20 août 2006 à 0:45:02

                  Salut,
                  J'ai déjà corrigé problème dans certain de mes codes sources postés par là.
                  Alors voici la fonction à appeller après ton scanf

                  void freebuffer(){
                     int c;
                     while((c=getchar())!='\n');
                  }

                  Normalement cela devrait fonctionnait et ne pas boucler infiniment ;).
                  • Partager sur Facebook
                  • Partager sur Twitter
                    20 août 2006 à 11:31:46

                    Merci beaucoup j'ai rajouté cette fonction comme tu dis mais maintenant j'ai un dernier petit problème.
                    Il faut appuyer deux fois sur Entrée pour sélectionner une option du menu :euh:
                    Voici le code du menu :
                    void afficherMenu()
                    {
                            long choixMenuPrincipal = 0;
                            do
                            {
                                    printf("MENU PRINCIPAL - Version %s\n", VERSION_PRGM);
                                    printf("1. Voir ses donations\n");
                                    printf("2. Ajouter une donation\n");
                                    printf("3. Gerer le fichier\n");
                                    printf("4. Quitter\n");
                                    printf("Que voulez-vous faire ? ");
                                    scanf("%ld", &choixMenuPrincipal);
                                    viderBuffer(); // Sécurité
                                    printf("\n");
                                    if (choixMenuPrincipal == 1)
                                    {
                                            afficherDonation();
                                            choixMenuPrincipal = 0;
                                    }
                                    else if (choixMenuPrincipal == 2)
                                    {
                                            ajouterDonation();
                                            choixMenuPrincipal = 0;
                                    }
                                    else if (choixMenuPrincipal == 3)
                                    {
                                            gererFichier();
                                            choixMenuPrincipal = 0;
                                    }
                                    else if (choixMenuPrincipal == 4)
                                    {
                                            break;
                                    }
                            } while (choixMenuPrincipal != 1 && choixMenuPrincipal != 2 && choixMenuPrincipal != 3);
                    }


                    Merci ^^
                    • Partager sur Facebook
                    • Partager sur Twitter
                      20 août 2006 à 11:50:06

                      Bon et bien moi j'ai fait ca:

                      void freebuffer(){
                        int c;
                        while((c=getchar())!='\n');
                      }

                      void afficherMenu(){
                        int choix=0;
                        do{
                          scanf("%d",&choix);
                          freebuffer();
                          switch(choix){
                          case 1:
                            //afficheDonation();
                            printf("1\n");
                            break;
                          case 2:
                            //ajouterDonation();
                            printf("2\n");
                            break;
                          case 3:
                            //gererFichier();
                            printf("3\n");
                            break;
                          }
                        }
                        while(choix!=4);
                      }

                      int main(){
                        afficherMenu();
                        return 0;
                      }


                      Tu me diras si c'est bon. Normalement tu n'a plus qu'a afficher tes autres fonctions et enlever les printf. Il quittera seulement si choix est égal à 4.
                      Bonne continuation :)
                      • Partager sur Facebook
                      • Partager sur Twitter
                        20 août 2006 à 12:15:11

                        Merci pour tes améliorations ^^

                        Sinon j'ai toujours le même problème, ça devient de plus en plus bizarre. Il faut appuyer 2 fois sur Entrée pour aller dans le choix 1 du menu, 1 seul fois pour le choix 2, 2 fois pour le choix 3 :s

                        Je met le code source entier de mon main.c si tu veux (il y aura 3 fonctions qui gèrent les fichiers que tu ne verras pas, dit moi si tu les veux :p)

                        Voilà c'est dans le premier post !
                        • Partager sur Facebook
                        • Partager sur Twitter
                          20 août 2006 à 12:30:50

                          wai je veux bien les sources que je voyes un peu ce qui cloche, on va pas laisser tombé un ZéroPotes :) lol. Ben postes le et je le prendrais. J'essaierais de le rectifier sans rien te promettre.
                          • Partager sur Facebook
                          • Partager sur Twitter
                            20 août 2006 à 12:42:24

                            Voilà tout est dans le premier post (sauf les prototypes, inutiles).
                            Merci de ton aide !
                            • Partager sur Facebook
                            • Partager sur Twitter
                              20 août 2006 à 12:43:40

                              Je veux bien le source entier si ca ne te pose pas de pb, comme ca que je vois vraiment si ta pas fait quelque chose d'autre dans les autres fonctions.
                              • Partager sur Facebook
                              • Partager sur Twitter

                              [C] Problème choix menu

                              × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                              × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                              • Editeur
                              • Markdown