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
    Membre averti
    Inscrit en
    Mai 2004
    Messages
    39
    D�tails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 39
    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 confirm�
    Avatar de Skyounet
    Homme Profil pro
    Software Engineer
    Inscrit en
    Mars 2005
    Messages
    6 380
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 38
    Localisation : Etats-Unis

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 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.

  3. #3
    Mod�rateur
    Avatar de bruno_pages
    Homme Profil pro
    ing�nieur informaticien � la retraite
    Inscrit en
    Juin 2005
    Messages
    3 551
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 65
    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 551
    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 : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activit� : D�veloppeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    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
    Membre averti
    Inscrit en
    Mai 2004
    Messages
    39
    D�tails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 39
    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
    Membre averti
    Inscrit en
    Mai 2004
    Messages
    39
    D�tails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 39
    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