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 :

un menu en C


Sujet :

C

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    67
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : Tunisie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 67
    Par défaut un menu en C
    Bonjour,
    je suis entrain de faire un petit programme en C sous linux qui présente un menu de choix qui me fait passer à un autre sous menu. mon problème c'est que j'arrive à afficher le premier menu et faire un choix mais ce dernier ne me mène pas au sous choix correspondant et le programme exit. je ne sais pas où est le probleme
    Merci de m'aider.

    voici une partie du code

    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
    #include <stdio.h>
    #include <types.h>
     
    int main()
    {
     
    FILE * FicEntree;
    char rep;
     
    printf("\n*******************Menu Test ********************\n");
     
    printf ("   1   GetParameterNames   \n");
    printf ("   2   AddObject   \n");
    printf ("   3   SetParameterValues    \n");
    printf ("   4   DeleteObject          \n");
    rep=getchar();
    switch (rep)
    {
           case '1': 
    {
          printf ("  avec 1 param   \n");
          printf ("   avec 2 param \n");
          rep2= getchar();
                 switch (rep2)
                  {
                             case '1' : printf ("  sous menu   \n");
                                  break;
                  }
    break;
    }
     
    }
    return 0;
    }

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    266
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 266
    Par défaut

    De plus il te manque le case default dans ton switch pour tester s'il ne rentre pas dans les case définis.
    Enfin rep2 n'est pas déclaré.

    Je pense que l'erreur vient du getchar()

    Et à quoi sert le ?

  3. #3
    Membre émérite Avatar de crocodilex
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    697
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 697
    Par défaut
    Ton code ne compile pas :
    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
    Project   : Console application
    Compiler  : GNU GCC Compiler (called directly)
    Directory : D:\CodeBlocks_Project\
    --------------------------------------------------------------------------------
    Switching to target: default
    Compiling: main.c
    main.c:2:19: types.h: No such file or directory
    main.c:5: warning: function declaration isn't a prototype
    main.c: In function `main':
    main.c:23: error: `rep2' undeclared (first use in this function)
    main.c:23: error: (Each undeclared identifier is reported only once
    main.c:23: error: for each function it appears in.)
    main.c:7: warning: unused variable `FicEntree'
    Process terminated with status 1 (0 minutes, 0 seconds)
    4 errors, 2 warnings
    La solution se trouve dans la FAQ : Comment vider le buffer clavier

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    67
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : Tunisie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 67
    Par défaut
    bonjour, merci à vous tous mais j'ai mentionné que c'est une partie du code

    voici un code plus complet et qui compile mais qui n'entre pas dans le second menu.
    Merci.

    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
    48
    49
    50
    51
     
    #include <stdio.h>
    #include <stdlib.h>
     
    int main(int argc, int**argv)
    {
     
    FILE * FicEntree;
    char rep,rep2;
    printf("\n*******************Menu Test *************************\n");
    printf ("   1   GetParameterNames   \n");
    printf ("   2   AddObject   \n");
    printf ("   3   SetParameterValues    \n");
    printf ("   4   DeleteObject          \n");
    printf ("   5   GetParameterValues    \n");
    printf ("   6   SetParameterAttributes \n");
    printf ("   7   GetParameterAttributes \n");
    printf ("   8   Test RPC methods   \n");
    printf ("   9   Test RPC reboot    \n");
    printf(" \n Entrez votre choix : ");
    rep=getchar();
     
    switch (rep)
    {
      case '1': 
                {
     
                printf("GetParameterNames with level 0 \n");
                printf("GetParameterNames with level 1 \n");
                printf("GetParameterNames with wrong level  \n");
                printf("GetParameterNames with wrong name level 1 \n");
                printf ("Entrez votre choix");
                rep2=getchar();
     
                 switch(rep2)
                    {
                  case '1':
                  printf ("second menu"); 
                } break;
     
                   }
     
      case  '2':
                printf("AddObject with valid object Name\n");
                printf("AddObject with wrong object Name \n");
                printf("AddObject not an object \n");
                printf("AddObject for an instanciated object and its number of instances is maximum  \n");
                break;
    default: printf ("gggggggggggggggggggg");
                   break;
    }

  5. #5
    Expert confirmé
    Avatar de PRomu@ld
    Homme Profil pro
    Ingénieur de Recherche
    Inscrit en
    Avril 2005
    Messages
    4 155
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Ingénieur de Recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 4 155
    Par défaut
    Désolé, mais ça ne compile pas chez moi.

    test.c:5: warning: second argument of 'main' should be 'char **'
    test.c: In function 'main':
    test.c:50: error: expected declaration or statement at end of input
    test.c:7: warning: unused variable 'FicEntree'
    test.c:50: warning: control reaches end of non-void function
    test.c: At top level:
    test.c:4: warning: unused parameter 'argc'
    test.c:4: warning: unused parameter 'argv'

  6. #6
    Expert confirmé
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Par défaut Re:
    Un exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    int main()
    {
        int choix;
     
        do
        {
            choix = AfficheMenuPrincipal();
            MenuPrincipal(choix);
        }
        while (choix != QUITTER);
     
        return 0;
    }
    La fonction AfficheMenuPrincipal() affiche le menu principal puis attend un choix de l'utilisateur. Cette fonction ne doit retourner que lorsque le choix de l'utilisateur est bien valide.

    La fonction MenuPrincipal() est sans doute un gros switch-case. Selon choix, soit on fait un truc utile, soit on affiche un sou menu. On crée autant de fonctions d'affichage de sous menus et de traitement du choix que l'on en a besoin.

  7. #7
    Expert confirmé
    Avatar de PRomu@ld
    Homme Profil pro
    Ingénieur de Recherche
    Inscrit en
    Avril 2005
    Messages
    4 155
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Ingénieur de Recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 4 155
    Par défaut
    Melem, tu n'as pas compris le problème de ziz2005 : son code ne fonctionne pas et il aimerait savoir pourquoi.

    ziz2005, affiches (via un printf par ex) la valeur de rep, juste pour voir.

  8. #8
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    266
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 266
    Par défaut
    Citation Envoyé par ziz2005
    bonjour, merci à vous tous mais j'ai mentionné que c'est une partie du code

    voici un code plus complet et qui compile mais qui n'entre pas dans le second menu.
    Merci.

    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
    48
    49
    50
    51
     
    #include <stdio.h>
    #include <stdlib.h>
     
    int main(int argc, int**argv)
    {
     
    FILE * FicEntree;
    char rep,rep2;
    printf("\n*******************Menu Test *************************\n");
    printf ("   1   GetParameterNames   \n");
    printf ("   2   AddObject   \n");
    printf ("   3   SetParameterValues    \n");
    printf ("   4   DeleteObject          \n");
    printf ("   5   GetParameterValues    \n");
    printf ("   6   SetParameterAttributes \n");
    printf ("   7   GetParameterAttributes \n");
    printf ("   8   Test RPC methods   \n");
    printf ("   9   Test RPC reboot    \n");
    printf(" \n Entrez votre choix : ");
    rep=getchar();
     
    switch (rep)
    {
      case '1': 
                {
     
                printf("GetParameterNames with level 0 \n");
                printf("GetParameterNames with level 1 \n");
                printf("GetParameterNames with wrong level  \n");
                printf("GetParameterNames with wrong name level 1 \n");
                printf ("Entrez votre choix");
                rep2=getchar();
     
                 switch(rep2)
                    {
                  case '1':
                  printf ("second menu"); 
                } break;
     
                   }
     
      case  '2':
                printf("AddObject with valid object Name\n");
                printf("AddObject with wrong object Name \n");
                printf("AddObject not an object \n");
                printf("AddObject for an instanciated object and its number of instances is maximum  \n");
                break;
    default: printf ("gggggggggggggggggggg");
                   break;
    }
    Bonjour,
    - ton code ne compile pas : il manque une accolade fermante (sûrement celle du main)
    - ton main est déclaré comme retournant un int, or tu ne retournes rien
    Ceci résolu ça compile chez moi et le premier menu s'affiche bien.
    Si j'entre '1' alors le second menu s'affiche très bien mais le programme quitte. Ceci est dû au second getchar() qui doit prendre le retour-chariot de la première réponse.

  9. #9
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    266
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 266
    Par défaut
    [EDIT: oups, désolé double post...]


    [EDIT : il faut vider le buffer clavier]
    ton code devient alors :
    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
     
    case '1': 
            {
     
                printf("GetParameterNames with level 0 \n");
                printf("GetParameterNames with level 1 \n");
                printf("GetParameterNames with wrong level  \n");
                printf("GetParameterNames with wrong name level 1 \n");
                printf ("Entrez votre choix");
                /* vider le buffer clavier */
                while ((c = getchar()) != '\n' && c != EOF); /* mange le tampon */
                rep2=getchar();
     
                switch(rep2)
                {
                    case '1':
                        printf ("second menu"); 
                } break;
            }
    avec c déclaré comme int plus haut avec tes déclarations

  10. #10
    Membre éclairé
    Avatar de odsen.s
    Profil pro
    Étudiant
    Inscrit en
    Octobre 2006
    Messages
    269
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2006
    Messages : 269
    Par défaut
    Ceci est dû au second getchar() qui doit prendre le retour-chariot de la première réponse.
    En effet, getchar() n'est pas adpaté à la saisie d'un caractère.
    Il faut vider stdin après usage :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    int lire_car (void)
    {
       int c = getchar ();
       if (c != '\n' && c != EOF)
       {
          int c;
          while((c = getchar ()) != '\n' && c != EOF);
       }
     
       return c;
    }

  11. #11
    Expert confirmé
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Par défaut
    Citation Envoyé par PRomu@ld
    Melem, tu n'as pas compris le problème de ziz2005 : son code ne fonctionne pas et il aimerait savoir pourquoi.
    Justement : On a affaire à un programme qui va afficher des menus et des sous menus et on met tout dans le main()? En découpant le programme en modules, on pourra plus facilement détecter les erreurs ...

  12. #12
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    67
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : Tunisie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 67
    Par défaut
    Bonjour,
    merci pour votre aide, j'ai bien trouvé mon erreur et tout marche bien maintenent.
    pour ceux qui sont intéressé par ce genre de menu voici un petit exemple que j'ai trouvé sur internet et qui est parfait bonne journée à tous !

    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
     
     
    #include <stdio.h>
     
    int main(void)
    {
        int choix = 0;
        printf("Menu du programme.\n\n");
        printf("1. Faire une adition\n");
        printf("2. Faire une soustraction\n");
        printf("3. Faire une multiplication\n");
        printf("4. Faire une division\n");
        printf("5. Autre operation\n");
        /* Demande du choix */
        scanf("%d", &choix);
        switch (choix)
        {
            case 1: 
                printf("|   Addition   |\n");
                /* reste du code */
                break;
            case 2:
                printf("|   Soustraction   |\n");
                /* reste du code */
                break;
            case 3:
                printf("|   Multiplication   |\n");
                /* reste du code */
                break;
            case 4:
                printf("|   Division   |\n");
                /* reste du code */
                break;
            case 5:
                printf("Autre operation\n");
                /* reste du code */
                break;
            default:
                printf("Non gere\n");
        }
        getchar();
        return 0;
    }

  13. #13
    Membre éclairé
    Avatar de odsen.s
    Profil pro
    Étudiant
    Inscrit en
    Octobre 2006
    Messages
    269
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2006
    Messages : 269
    Par défaut
    Salut,

    pour ceux qui sont intéressé par ce genre de menu voici un petit exemple que j'ai trouvé sur internet et qui est parfait
    Il n'est pas parfait car il utilise scanf ().
    Je rappelle que scanf () n'est pas adaptée pour effectuer des saisies.
    Si on effectue ton programme en boucle, ça serait une catastrophe.
    Il vaut mieux utiliser une fonction ressemblant à celle citée plus haut, c'est tout à fait adapté pour les choix dans un menu :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    int lire_car (void)
    {
       int c = getchar ();
       if (c != '\n' && c != EOF)
       {
          int c;
          while((c = getchar ()) != '\n' && c != EOF);
       }
     
       return c;
    }

  14. #14
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Citation Envoyé par odsen.s
    Il n'est pas parfait car il utilise mal scanf ().
    Je rappelle que scanf () n'est pas adaptée pour les débutants.
    Contrairement à gets(), scanf() n'est pas un bug, et peut être correctement utilisée.
    Toutefois, il est très facile de mal l'utiliser. Les deux pires utilisations possibles de scanf() sont :
    • scanf("%s", ...);
    • Enseigner scanf() à des débutants.

    Pour apprendre à utiliser scanf() correctement :
    http://xrenault.developpez.com/tutoriels/c/scanf/
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  15. #15
    Membre éprouvé Avatar de BainE
    Inscrit en
    Mai 2004
    Messages
    1 327
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 1 327
    Par défaut
    Bonjour,

    de plus pour revenir sur la perfection,

    come cité un peu plus haut, il faudrait encapsuler un "menu" dans un do - while pour boucler dessus... (en cas d'erreur de frappe notement)
    et truc bete, le jour ou ton menu a 10 choix possible, ca va pas etre facile avec le getchar()...

    Mais bon...

  16. #16
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par ziz2005
    voici une partie du code
    C'est bien le problème. Ce code est incomplet et il ne compile pas. Il ne peut donc pas être mis au point sans faire d'hypothèses.

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

Discussions similaires

  1. TreeView et menu contextuel...
    Par agh dans le forum Composants VCL
    Réponses: 6
    Dernier message: 06/04/2009, 12h23
  2. [système] Comment ajouter un item dans le context menu de Windows ?
    Par ddmicrolog dans le forum API, COM et SDKs
    Réponses: 8
    Dernier message: 29/06/2005, 17h03
  3. Menu d'installation
    Par Le Yannos dans le forum Langage
    Réponses: 3
    Dernier message: 27/08/2002, 22h15
  4. Inserer Un Menu dans un autre en execution
    Par apt dans le forum Composants VCL
    Réponses: 2
    Dernier message: 12/08/2002, 11h22
  5. Menu en GL
    Par Kaïn dans le forum OpenGL
    Réponses: 2
    Dernier message: 06/05/2002, 11h58

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