IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

[Boucle Infinie] pour un menu


Sujet :

C++

  1. #1
    Nouveau membre du Club
    Inscrit en
    Mai 2004
    Messages
    39
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 39
    Points : 34
    Points
    34
    Par défaut [Boucle Infinie] pour un menu
    Bonjour,

    j'ai voulu faire un petit menu me permettant de configurer certaines valeurs d'une classe, jusque là rien de compliqué mais :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    #include <iostream>
     
    using namespace std;
     
    // à l'origine c une methode de classe
    // mais comme ça, ça plante également
     
    void    menu()
    {
        int v1 = 0; // remplacé par une variable de classe
        int v2 = 0; // de meme
        char    choix = '0';
     
        do {
            cout << "Choix ? " << endl;
            cin >> choix;
        } while (choix != '1'&& choix != '2');
     
     
        switch (choix)
        {
            case '1':
                cout << "Entrer variable v1 " << endl;
                cin >> v1;
                menu();  // je veux relancer menu pour réafficher mes variables
                             // afin de pouvoir en configurer plusieurs et lancer un
                             // traitement apres ( qui depend de ces variables )
                             // ca permet de visualiser la configuration
                             // et donc de remodifier avant de lancer le traitement
                break;
            case '2':
                cout << "Entrer variable v2 " << endl;
                cin >> v2;
                menu();
                break;
            default:
                menu();
                break;
        }
     
    }
     
    int main()
    {
        menu();
        system("PAUSE");
    }
    Ce code boucle lorsque je rentre un caractere à la place d'un chiffre lors du cin sur une variable, et ceci aussi bien avec un 'a' qu'un '-' .

    Choix ?
    2

    Entrer la variable v2 :
    a

    Choix ?
    Choix ?
    Choix ?
    Choix ?
    Choix ?
    Choix ?
    Choix ?
    etc ...
    quelqu'un peut il m'expliquer ce phénomène, et comment y remedier !
    car pour moi en relançant menu();
    mon choix est remis à 0, donc je dois forcement rentrer dans le do while et le cin devrait arreter la boucle car il attend que l'on tape quelquechose.



    Merci d'avance.

  2. #2
    Expert éminent sénior
    Avatar de Skyounet
    Homme Profil pro
    Software Engineer
    Inscrit en
    Mars 2005
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Software Engineer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 380
    Points : 13 380
    Points
    13 380
    Par défaut
    Comment y remedier :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    char buffer[20];
    fgets(buffer, 20, stdin);
    sscanf(buffer, "%d", &v1);
    Il me semble que ca marche si ce n'est pas le cas, quelqu'un reagira surement.
    Introduction à Silverlight 4 (new) ; Localisation d'une application Silverlight (new) ;
    Mon espace perso[/B]

    La connaissance s’acquiert par l’expérience, tout le reste n’est que de l’information. Albert Einstein[/SIZE]

  3. #3
    Modérateur
    Avatar de bruno_pages
    Homme Profil pro
    ingénieur informaticien à la retraite
    Inscrit en
    Juin 2005
    Messages
    3 533
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : ingénieur informaticien à la retraite
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juin 2005
    Messages : 3 533
    Points : 6 709
    Points
    6 709
    Par défaut Re: [Boucle Infinie] pour un menu
    Citation Envoyé par NhyMbuS
    Choix ?
    2

    Entrer la variable v2 :
    a

    Choix ?
    Choix ?
    etc ...
    je ne vois pas ce qu'il y a de bizarre, ton 'a' est le nom de la variable, une fois qu'il est lu tu rappelles menu (soit dit en passant, j'espère que ton compilateur voit qu'il s'agit d'une recursion terminale et transforme ton appel fonctionnel en un simple jump) ... et il n'y a aucun moyen d'en sortir car quoi qu'il arrive tu rappelle menu !

    a part cela :
    • la mise à '0' de choix ne sert strictement a rien, elle est donc génante et doit être retiree
    • les inits de v1 et v2 ne servent à rien ici mais apparemment tu vas changer ces variables
    • le cas default du switch ne sert à rien car tu ne sorts de la boucle do while que si choix est '1' ou '2'
    Bruno Pagès, auteur de Bouml (freeware), mes tutoriels sur DVP (vieux, non à jour )

    N'oubliez pas de consulter les FAQ UML et les cours et tutoriels UML

  4. #4
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Il faut détecter les erreurs de saisie (mauvais type, comme ici un 'a' dans un int). Ensuite dans ces cas, il faut remettre le flux d'entrée (cin) dans un état valide et le vider avant de pouvoir resaisir quelque chose.

    Voir la FAQ C++ pour les détails.

  5. #5
    Nouveau membre du Club
    Inscrit en
    Mai 2004
    Messages
    39
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 39
    Points : 34
    Points
    34
    Par défaut
    je ne vois pas ce qu'il y a de bizarre, ton 'a' est le nom de la variable, une fois qu'il est lu tu rappelles menu (soit dit en passant, j'espère que ton compilateur voit qu'il s'agit d'une recursion terminale et transforme ton appel fonctionnel en un simple jump) ... et il n'y a aucun moyen d'en sortir car quoi qu'il arrive tu rappelle menu !
    c'est parce que mon menu en fait depend des variables v1 et v2 ( qui sont contenues dans une classe , la fonction menu étant une méthode de classe), en fait j'actualise le menu.
    et ce qu'il y a de bizarre, c'est que le 'a' est un caractère, alors que j'attends un int, même si c'est à peu près la même chose c'est cette erreur que je dois intercepter, mais je pensais l'avoir déja fait.
    J'utilise devc++, mais je ne sais pas si mingw le transforme en jump

    a part cela :


    la mise à '0' de choix ne sert strictement a rien, elle est donc génante et doit être retiree

    les inits de v1 et v2 ne servent à rien ici mais apparemment tu vas changer ces variables

    le cas default du switch ne sert à rien car tu ne sorts de la boucle do while que si choix est '1' ou '2'
    ce sont des habitudes de programmation, on m'a toujours dit d'initialiser mes variables, comme ça je sais si elles n'ont pas été affectées. par exemple si je ne dois pas avoir de 0 dans mes variables, je fais un test et je sais que ça n'a pas été initialisé correctement, c'est une précaution .
    Dans le cas d'un int, ça évite qu'il prenne une valeur aléatoire, comme 64452, qui par le plus grand des hasards pourrait être une valeur que j'attends.
    De meme pour le default, on m'a toujours dit également qu'un switch sans default peut etre dangereux dans certains cas.


    Il faut détecter les erreurs de saisie (mauvais type, comme ici un 'a' dans un int). Ensuite dans ces cas, il faut remettre le flux d'entrée (cin) dans un état valide et le vider avant de pouvoir resaisir quelque chose.

    Voir la FAQ C++ pour les détails.
    Je n'avais pas pensé à remettre le cin dans un état valide, je vais me plonger dans la FAQ plus assiduement ( car je l'avais déja fait avant mais surement d'une mauvaise façon )

    Merci beaucoup pour vos réponses !
    à vrai dire quand on est plongé dans un code, difficile de se sortir de ce que l'on croit être bon mais qui ne fonctionne pas.

    cordialement
    NhyMbuS

  6. #6
    Nouveau membre du Club
    Inscrit en
    Mai 2004
    Messages
    39
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 39
    Points : 34
    Points
    34
    Par défaut
    Merci beaucoup, mais je n'avais pas pensé à chercher dans la partie console !

    ce que je ne comprennais pas, c'etait pourquoi une erreur dans les variables influait sur le choix, mais là c'est plus clair !

    http://c.developpez.com/faq/cpp/?pag...#SL_cin_verify

    Merci encore !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 23/03/2013, 00h42
  2. Fonction Kbhit() pour arret de boucle infinie
    Par nuFox dans le forum Linux
    Réponses: 1
    Dernier message: 10/04/2008, 19h45
  3. Instruction pour arreter une boucle infinie
    Par pitizone dans le forum MATLAB
    Réponses: 2
    Dernier message: 22/03/2007, 14h42
  4. [JMeter] Problème avec la boucle infinie pour les tests
    Par zegreg dans le forum Tests et Performance
    Réponses: 1
    Dernier message: 05/10/2005, 11h41

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo