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 :

Problème de switch + boolean


Sujet :

C

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    66
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 66
    Points : 64
    Points
    64
    Par défaut Problème de switch + boolean
    Bonjour,

    Pour pratiquer un peu ce que j'ai lu du C, je suis en train d'effectuer un exercice qui consiste a faire une mini appli annuaire en mode console. ( "Le Langage c par l'exemple" => fichiers )

    Je ne parviens pas a déclarer un boolean dans mes entetes de fonctions
    Car j'obtiens le message suivant :
    [C++ Erreur] Unit1.c(20): E2451 Symbole 'bool' non défini
    ( borland C++ builder )

    Aussi, je ne comprends pas, dans le switch suivant :
    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
    int main(void)
    {
      int optChoosed;
      int stopBoucle = 0;
    
      while( !stopBoucle )
      {
      printf("Que voulez vous faire ? \n");
    
      printf("1, Ajouter a annuaire \n");
      printf("2, Rechercher \n");
      printf("3, Voir \n");
      printf("-1, quitter \n");
    
      scanf("%d", &optChoosed);
    
       switch( optChoosed )
       {
       case 1 :
       addSomeoneToAnnu();
       break;
    
       case 2 :
       searchSomeoneInAnnu();
       break;
    
       case 3 :
       listAnnu(L_FILENAME);
       break;
    
       case -1 :
       stopBoucle = 1;
       break;
    
       default :
       printf("Unknow %d", optChoosed );
       break;
       }
      }
      return 0;
    }
    lorsque je saisis n'importe quel element qui n'est pas dans le switch ( exemple : "q" ), je n'arrive pas dans le "default :".

    Quelqu'un pourrait me dire ce que j'ai manqué ?

  2. #2
    Expert éminent
    Avatar de raptor70
    Inscrit en
    Septembre 2005
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Septembre 2005
    Messages : 3 173
    Points : 6 812
    Points
    6 812
    Par défaut
    Citation Envoyé par BobLunique Voir le message
    Je ne parviens pas a déclarer un boolean dans mes entetes de fonctions
    As tu un exemple ??

    Citation Envoyé par BobLunique Voir le message
    je n'arrive pas dans le "default :".
    Quelqu'un pourrait me dire ce que j'ai manqué ?
    J'ai essayé ton code ... et, chez moi, il fonctionne correctement en entrant des entiers ( connu ou inconnu ) .. par contre, la possibilité d'entrer des lettres est mal gérer... il tourne en boucle.. est ce ca ton problème ?

  3. #3
    Expert éminent
    Avatar de raptor70
    Inscrit en
    Septembre 2005
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Septembre 2005
    Messages : 3 173
    Points : 6 812
    Points
    6 812
    Par défaut
    Pour une ¨meilleur utilisation du scanf : http://xrenault.developpez.com/tutoriels/c/scanf/

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    66
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 66
    Points : 64
    Points
    64
    Par défaut
    Merci pour le tutoriel sur scanf, je vais le lire. ( ça m'evitera surement plein d'intérrogation )


    Pour que tu puisse compiler / voir, coici le code complet :

    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
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    #include <stdio.h>
    #include <conio> // for getch()
    #include <string.h>
    #define L_FILENAME "l_annu.txt"
     
    struct personne
    {
     char cname[20], cfirstname[20], cphonenumber[20];
     int yearsold;
    }currentPersonne;
     
    void displaySomeone( struct personne *lp);
    void listAnnu( char *fname );
    void addSomeoneToAnnu( void );
    void searchSomeoneInAnnu( void );
     
    int main(void)
    {
      int optChoosed;
      int stopBoucle = 0;
     
      while( !stopBoucle )
      {
      printf("Que voulez vous faire ? \n");
     
      printf("1, Ajouter a annuaire \n");
      printf("2, Rechercher \n");
      printf("3, Voir \n");
      printf("-1, quitter \n");
     
      scanf("%d", &optChoosed);
     
       switch( optChoosed )
       {
       case 1 :
       addSomeoneToAnnu();
       break;
     
       case 2 :
       searchSomeoneInAnnu();
       break;
     
       case 3 :
       listAnnu(L_FILENAME);
       break;
     
       case -1 :
       stopBoucle = 1;
       break;
     
       default :
       printf("Unknow %d", optChoosed );
       break;
       }
      }
      return 0;
    }
     
    void displaySomeone( struct personne *lp)
    {
    printf("%s %s \n", lp -> cname, lp -> cfirstname );
    printf("Age : %d \n",  lp -> yearsold  );
    printf("Tel : %s \n",  lp -> cphonenumber  );
    printf("\n\n");
    }
     
    void listAnnu( char *fname )
    {
      FILE *lf;
      lf = fopen( fname, "rt");
     
      printf("\n\nL'annuaire contient : \n\n");
     
      do
      {
      fread( &currentPersonne, sizeof( struct personne ), 1, lf );
      if( !feof( lf ) ) displaySomeone( &currentPersonne );
      }while( !feof( lf ) );
     
      fclose( lf );
    }
     
    void searchSomeoneInAnnu( void )
    {
     int lselected, wichId;
     int i = 0;
     char lname[20];
     struct personne tpersonne[20];
     struct personne *pointed;
     long fnbPersonne;
     FILE *lfile;
     printf("Vous souhaitez rechercher par ID ( 1 ) ou par NOM  ( 2 )?");
     scanf( "%d", &lselected );
     
     lfile = fopen( L_FILENAME, "r" );
     fseek( lfile, 0, SEEK_END );
     fnbPersonne = ftell( lfile ) / sizeof( struct personne );
     
     switch( lselected )
     {
     case 1 :
     
     printf("ID ?");
     scanf("%d", &wichId);
     
       if( wichId < fnbPersonne && wichId > 0 )
       {
         fseek( lfile, sizeof( struct personne )*(wichId - 1 ), SEEK_SET );
         fread( &currentPersonne, sizeof( struct personne ), 1, lfile );
         displaySomeone( &currentPersonne );
       }
       else
       {
        printf("%d does not exist", wichId );
       }
     
     
     break;
     
     case 2 :
     
     printf("Son nom ? \n");
     scanf("%s", lname );
     fseek( lfile, 0, SEEK_SET );
     fread( tpersonne, sizeof( struct personne ), fnbPersonne, lfile );
     
     for( pointed = tpersonne, i = 0; i < fnbPersonne; i++, pointed++ )
     {
       if( strcmp( pointed-> cname, lname ) == NULL )
       {
       printf("Person found, old = %d \n", pointed->yearsold );
       }
     
     pointed++;
     }
     break;
     
     }
     
     fclose( lfile );
    }
     
    void addSomeoneToAnnu( void )
    {
    char *yesno;
      FILE *dirt;
      yesno = "Y";
     
      dirt = fopen( L_FILENAME, "at");
     
      do
      {
      printf("Nom prenom \n");
      scanf("%s %s", &currentPersonne.cname, &currentPersonne.cfirstname );
     
      printf("Age :\n");
      scanf("%d", &currentPersonne.yearsold );
     
      printf("Telephone :\n");
      scanf("%s", &currentPersonne.cphonenumber );
     
      printf("Ecrire Y or N \n");
      scanf( "%s", yesno );
     
        if( yesno[0] == 'Y' )
        {
        fwrite( &currentPersonne, sizeof( struct personne ), 1, dirt );
        }
     
      printf("Ajouter qqn autre ? Y or N \n");
      scanf( "%s", yesno );
     
      }while( yesno[0] == 'Y' );
     
      fclose( dirt );
    }
    Mon probléme est donc que arrivé ici :
    printf("Que voulez vous faire ? \n");

    si je tape "q", la premiére condition du switch est prise en compte.


    Je ne parviens pas a déclarer un boolean dans mes entetes de fonctions
    ___
    As tu un exemple ??
    Par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    int main(void)
    {
      int optChoosed;
      bool stopBoucle = false;
    empeche la compilation :
    [C++ Erreur] Unit1.c(20): E2451 Symbole 'bool' non défini

  5. #5
    Expert éminent
    Avatar de raptor70
    Inscrit en
    Septembre 2005
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Septembre 2005
    Messages : 3 173
    Points : 6 812
    Points
    6 812
    Par défaut
    Pour ton problème de booléen .. je ne vois pas du tout ton problème car, chez moi, sous Visual Studio, le code la marche très bien :
    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
    int main(void)
    {
        int optChoosed;
        bool stopBoucle = false;
    
        while( !stopBoucle )
        {
            printf("Que voulez vous faire ? \n");
    
            printf("1, Ajouter a annuaire \n");
            printf("2, Rechercher \n");
            printf("3, Voir \n");
            printf("-1, quitter \n");
    
            scanf("%d", &optChoosed);
    
            switch( optChoosed )
            {
            case 1 :
                addSomeoneToAnnu();
                break;
    
            case 2 :
                searchSomeoneInAnnu();
                break;
    
            case 3 :
                listAnnu(L_FILENAME);
                break;
    
            case -1 :
                stopBoucle = true;
                break;
    
            default :
                printf("Unknow %d", optChoosed );
                break;
            }
        }
        return 0;
    }
    Poir ton problème de switch .. le comportement semble correct chez moi ... le seul problème est quand tu tapes du texte à la place des chiffres.. le scanf pose problème.. On dirait qu'il n'arrive pas à recupérer un entier donc il garde ta ligne en mémoire... je pense que mieux gérer ce cas résoudra ton problème. Tu peux par exemple toujours récupérer un chaine de caractères .. et ensuite la convertir en entier.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    char buffer[256];
    int optChoosed;
     
    scanf( "%s", &buffer );
    optChoosed = Convert( buffer ); // Convert n'existe pas ... convertit une chaine en entier .. à toi de la défnir

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    66
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 66
    Points : 64
    Points
    64
    Par défaut
    Pour le switch,
    pour faire vite j'ai essayé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    int strToInt( char *str )
    {
     return (int)*str;
    }
    et c'est exact, il passe bien dans le default lorsque je traite toujours une chaine convertie en entier.

    Pour mon probléme de bool, je suppose que je vais devoir trifouiller les menus, et cela me degoute un peu .

    Merci en tout cas

  7. #7
    Expert éminent
    Avatar de raptor70
    Inscrit en
    Septembre 2005
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Septembre 2005
    Messages : 3 173
    Points : 6 812
    Points
    6 812
    Par défaut
    Citation Envoyé par BobLunique Voir le message
    Pour le switch,
    pour faire vite j'ai essayé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    int strToInt( char *str )
    {
     return (int)*str;
    }
    Ce serait trop simple si c'etait comme ca ... la, je pense qu'il va te sortir la valeur ASCII du premier caractère de ta chaine ..

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    66
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 66
    Points : 64
    Points
    64
    Par défaut
    Oui je sais, mais apres ça, le "default" du switch etait bien utilisé.
    Donc ton diagnostic s'est révélé correct ( et je me suis dis "Bon, on va dire que j'ai finit l'exercice, sinon je ne vais pas avancer" )

  9. #9
    Expert éminent
    Avatar de raptor70
    Inscrit en
    Septembre 2005
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Septembre 2005
    Messages : 3 173
    Points : 6 812
    Points
    6 812
    Par défaut
    Citation Envoyé par BobLunique Voir le message
    Oui je sais, mais apres ça, le "default" du switch etait bien utilisé.
    Donc ton diagnostic s'est révélé correct ( et je me suis dis "Bon, on va dire que j'ai finit l'exercice, sinon je ne vais pas avancer" )
    C'etait juste pour te le préciser ... pour pas que tu te demandes pour tes valeurs sont fausses

  10. #10
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Points : 4 637
    Points
    4 637
    Par défaut
    Citation Envoyé par BobLunique Voir le message
    Mon probléme est donc que arrivé ici :
    printf("Que voulez vous faire ? \n");

    si je tape "q", la premiére condition du switch est prise en compte.
    Oui, c'est possible tout comme il peut passer dans n'importe quel cas (y compris le default).

    scanf("%d", &optChoosed); tente de lire un entier. Lorsque tu saisie un caractere, la lecture echoue, la lettre saisie reste dans le flux (d'ou une possibilite de boucle infini) et optChoosed n'est pas mis a jour (et comme ici elle n'a pas ete initialise, sa valeur est aleatoire, tout peut arriver).

    Il est indispensable soit d'utiliser correctement scanf (notament en testant la valeur de retour et en vidant le flux d'entree), soit d'utiliser corrctement des fonction de saisie plus abordables.

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

Discussions similaires

  1. Problème fonction switch
    Par mitherkiller dans le forum C
    Réponses: 4
    Dernier message: 22/02/2007, 15h48
  2. Problème de switch-case ou de buffer ?
    Par Gilouou dans le forum C
    Réponses: 8
    Dernier message: 11/11/2006, 21h08
  3. [Cookies] problème de switch
    Par artotal dans le forum Langage
    Réponses: 1
    Dernier message: 28/12/2005, 02h35
  4. Problème ou normal : Boolean / GetValue ?
    Par mchicoix dans le forum XMLRAD
    Réponses: 11
    Dernier message: 14/11/2005, 23h27
  5. [Tableaux] Problème avec Switch case
    Par philippef dans le forum Langage
    Réponses: 4
    Dernier message: 07/09/2005, 16h37

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