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 :

J'aime trop ton bool


Sujet :

C

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    371
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 371
    Par défaut J'aime trop ton bool
    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
    //---------------------------------------------------------------------------
     
    #pragma hdrstop
    #pragma argsused
    #include <stdio.h>
    #include <conio.h>
    #include <string.h>
     
    /* ---------------- Variables globales -------------------------------------*/
    enum bool{faux,vrai};
    struct identite {
                          int age;
                          char prenom[20];
                          char nom[20];
    };
    struct contact {
                          char num[20];
                          char prenom[20];
                          char nom[20];
            };
     
    //-----------------------------------------------------------------------------
    enum bool affichage(struct contact m,struct identite m2) {
            enum bool bouboul;
     
            getch();
            if (strcmp(m.prenom,m2.prenom)==0)
                    bouboul=vrai;
     
            return bouboul;
     
    }
    //-----------------------------------------------------------------------------
    int main()
    {
    //------------   declarations locales -----------------------------------------
            struct contact moi;
            struct identite moi2;
            enum bool mon;
     
    //------ DEBUT --------------------------------------------------------------
     
            printf( "\n Entrer votre prenom :  " );
            scanf("%s",&moi2.prenom);
     
            strcpy(moi.prenom,moi.prenom);
     
            printf(" \n entrer votre nom  :  ");
            scanf("%s",&moi2.nom);
     
            strcpy(moi.prenom,moi2.prenom);
     
            mon=affichage(moi,moi2);
     
            printf("\n monbool : %d ",mon);
            getch();
     
     
     
            return 0;
    }
    //---------------------------------------------------------------------------
    Bonjour ,

    je comprend pas pourquoi mon printf du main concernant laffichage de la valeur de mon bool naffiche pas 1.
    alors que jai tout fait por que ca le fasse ...
    de plus lorsque dans la focntion , je mets un

    et que cette fois ci je fais tout pourquil soit faux bah lorsuqe je jessais daficher sa valeur num. ca maffiche un vieux truc moisi

    besoin de votre aide
    jai limpression que le compilateur me renvoi une valeur de mon bool aleatoire .. meme si je sais que cest pas possible ...

  2. #2
    Membre Expert
    Avatar de Gruik
    Profil pro
    Développeur Web
    Inscrit en
    Juillet 2003
    Messages
    1 566
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2003
    Messages : 1 566
    Par défaut
    Salut,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    enum bool affichage(struct contact m,struct identite m2) {
            enum bool bouboul;
     
            getch();
            if (strcmp(m.prenom,m2.prenom)==0)
                    bouboul=vrai;
     
            return bouboul;
     
    }
    bouboul peut ne pas être valorisé, la valeur retournée peut être n'importe quoi

  3. #3
    Membre expérimenté

    Homme Profil pro
    Ingénieur logiciel embarqué
    Inscrit en
    Juillet 2002
    Messages
    404
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur logiciel embarqué
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juillet 2002
    Messages : 404
    Par défaut
    en effet... et tu peu y remedier en initialisant bouboul a faux par exemple.

    a ma conaissance une variable n'est automatiquement initialisée que dans le cas ou elle est "static"

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

    Informations forums :
    Inscription : Octobre 2007
    Messages : 362
    Par défaut
    Si tu corriges ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     strcpy(moi.prenom,moi.prenom);
    Tu arriveras peut-être à avoir un comportement compréhensible...

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    371
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 371
    Par défaut
    Citation Envoyé par Gruik Voir le message
    Salut,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    enum bool affichage(struct contact m,struct identite m2) {
            enum bool bouboul;
     
            getch();
            if (strcmp(m.prenom,m2.prenom)==0)
                    bouboul=vrai;
     
            return bouboul;
     
    }
    bouboul peut ne pas être valorisé, la valeur retournée peut être n'importe quoi
    questce que tu veux dire ?
    je suis juste etudiant et nous commencons le C.
    lorsque je mets le debugueur ... je bloque juste apres la focntion et je vois bien que bouboul retourné est egal à 1 ... or avec le printf , il a une autre valeur ...
    idem pour "faux" ...

  6. #6
    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 Pugebad Voir le message
    jai limpression que le compilateur me renvoi une valeur de mon bool aleatoire .. meme si je sais que cest pas possible ...
    Le compilateur n'a rien à voir. Une fois ton code remis en forme et débarrassé de ses erreurs basiques
    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
     
     
    //---------------------------------------------------------------------------
     
    #include <stdio.h>
    #include <string.h>
     
    /* ---------------- Variables globales -------------------------------------*/
    enum bool
    { faux, vrai };
    struct identite
    {
       int age;
       char prenom[20];
       char nom[20];
    };
    struct contact
    {
       char num[20];
       char prenom[20];
       char nom[20];
    };
     
    //-----------------------------------------------------------------------------
    enum bool affichage (struct contact m, struct identite m2)
    {
       enum bool bouboul;
     
       if (strcmp (m.prenom, m2.prenom) == 0)
          bouboul = vrai;
     
       return bouboul;
     
    }
     
    //-----------------------------------------------------------------------------
    int main (void)
    {
    //------------   declarations locales -----------------------------------------
       struct contact moi;
       struct identite moi2;
       enum bool mon;
     
    //------ DEBUT --------------------------------------------------------------
     
       printf ("\n Entrer votre prenom :  ");
       scanf ("%s", moi2.prenom);
     
       strcpy (moi.prenom, moi.prenom);
     
       printf (" \n entrer votre nom  :  ");
       scanf ("%s", moi2.nom);
     
       strcpy (moi.prenom, moi2.prenom);
     
       mon = affichage (moi, moi2);
     
       printf ("\n monbool : %d ", mon);
     
       return 0;
    }
     
    //---------------------------------------------------------------------------
    il reste :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    Project   : Forums
    Compiler  : GNU GCC Compiler (called directly)
    Directory : C:\dev\forums\
    --------------------------------------------------------------------------------
    Switching to target: default
    Compiling: main.c
    main.c: In function `affichage':
    main.c:26: warning: 'bouboul' might be used uninitialized in this function
    main.c: In function `main':
    main.c:48: warning: statement with no effect
    Linking console executable: console.exe
    Process terminated with status 0 (0 minutes, 0 seconds)
    0 errors, 2 warnings
    Ce qui est largement suffisant pour justifier un comportement indéfini...

  7. #7
    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 Pugebad Voir le message
    questce que tu veux dire ?
    je suis juste etudiant et nous commencons le C.
    lorsque je mets le debugueur ... je bloque juste apres la focntion et je vois bien que bouboul retourné est egal à 1 ... or avec le printf , il a une autre valeur ...
    idem pour "faux" ...
    On se tue à te dire qu'une variable locale n'a pas de valeur définie par défaut. Ca peut donc être n'importe quoi. Si tu ne passes pas par la branche qui assigne bouboul, la valeur retournée est indéfinie (moisie, comme tu le dis si bien...). C'est si difficile que ça à comprendre ?

  8. #8
    Membre Expert
    Avatar de Gruik
    Profil pro
    Développeur Web
    Inscrit en
    Juillet 2003
    Messages
    1 566
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2003
    Messages : 1 566
    Par défaut
    Citation Envoyé par Emmanuel Delahaye Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    main.c:26: warning: 'bouboul' might be used uninitialized in this function
    Notez que ce warning n'apparait pas en -O0 avec gcc 3, ce qui est quand meme un probleme vu qu'en général on veut pouvoir debugger en phase de test et qu'on enleve l'optimisation

  9. #9
    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 Gruik Voir le message
    Notez que ce warning n'apparait pas en -O0 avec gcc 3, ce qui est quand meme un probleme vu qu'en général on veut pouvoir debugger en phase de test et qu'on enleve l'optimisation
    Bizarre. Mon reglage actuel :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    -Wall -Wextra -O -Wwrite-strings -Wstrict-prototypes -Wuninitialized
    -Wunreachable-code
    P.S. Ah, OK, je vois ce que tu veux dire. L'optimisation n'empêche pas le déboguage. Simplement, parfois, l'exécution pas à pas est un peu surprenante, c'est tout....

  10. #10
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    371
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 371
    Par défaut
    Citation Envoyé par Emmanuel Delahaye Voir le message
    On se tue à te dire qu'une variable locale n'a pas de valeur définie par défaut. Ca peut donc être n'importe quoi. Si tu ne passes pas par la branche qui assigne bouboul, la valeur retournée est indéfinie (moisie, comme tu le dis si bien...). C'est si difficile que ça à comprendre ?
    passer par la branche qui assigne bouboul ??? je vois pas trop dsl

  11. #11
    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 Pugebad Voir le message
    passer par la branche qui assigne bouboul ??? je vois pas trop dsl
    Tu apprends l'informatique comment ? En lisant des mangas ?
    Tu ne sais pas ce qu'est une branche ? Une assignation ?

  12. #12
    Membre chevronné
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    362
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 362
    Par défaut
    Bon, ce qu'on te dit c'est que dans affichage, tu as un "if".

    Un if crée deux branches dans ton programme, tu suivras l'une ou l'autre selon son résultat.

    Ici, tu fais quelque chose dans le cas "oui" : bouboul = vrai.

    Mais dans le cas (la branche) "non", que vaut bouboul ?!

    C'est ce que te dit gentiment le compilateur par le message :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    main.c:26: warning: 'bouboul' might be used uninitialized in this function
    Il convient donc d'initialiser bouboul (à faux) au début de ta fonction.

  13. #13
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    371
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 371
    Par défaut
    Merci frement pour ta réponse clair et précise

  14. #14
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    371
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 371
    Par défaut
    jaffectes bouboul de fonction à faux en debut mais tjs le meme probleme

    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
    //---------------------------------------------------------------------------
     
    #pragma hdrstop
    #pragma argsused
    #include <stdio.h>
    #include <conio.h>
    #include <string.h>
     
    /* ---------------- Variables globales -------------------------------------*/
    enum bool{faux,vrai};
    struct identite {
                          int age;
                          char prenom[20];
                          char nom[20];
    };
    struct contact {
                          char num[20];
                          char prenom[20];
                          char nom[20];
            };
     
    //-----------------------------------------------------------------------------
    enum bool affichage(struct contact m,struct identite m2) {
            enum bool bouboul=faux;
     
            if (strcmp(m.prenom,m2.prenom)==0) {
                    bouboul=vrai;
            }
            else  {
                    bouboul=faux;
            }
            printf ("\n %d",bouboul);
     
            return bouboul;
     
    }
    //-----------------------------------------------------------------------------
    int main()
    {
    //------------   declarations locales -----------------------------------------
            struct contact moi;
            struct identite moi2;
            enum bool mon=faux;
     
    //------ DEBUT --------------------------------------------------------------
     
            printf( "\n Entrer votre prenom :  " );
            scanf("%s",&moi2.prenom);
     
            strcpy(moi.prenom,moi2.prenom);
     
            mon=affichage(moi,moi2);
            printf ("\n%d",mon);
            getch();
     
     
     
            return 0;
    }
    //---------------------------------------------------------------------------

  15. #15
    Membre chevronné
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    362
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 362
    Par défaut
    Salut Pugebad,

    Je n'ai pas répondu + tôt car je n'avais pas de compilo sur ma becane. Je viens de tester ton code avec Code::Blocks, il affiche bien deux fois 1, comme le code le laissait prévoir . Peut-être que si tu donnes des précisions sur ton environnement de travail, des spécialistes C du forum seront capable de t'expliquer ce qui ne marche pas sur ta machine ??

    Juste une petite remarque : pourquoi as-tu codé un else (bouboul=faux) alors que bouboul est déjà initialisé à faux lors de sa déclaration. Cela ne sert à rien ! Idem pour l'initialisation de mon, puisqu'il est affecté systématiquement par l'instruction :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    mon=affichage(moi,moi2);
    Tu es passé d'une situation dans laquelle tu laissais une variable dans un état incertain (ce qui est fort risqué) à une autre où tu répètes partout la même chose. Ce n'est guère mieux, si tu te places dans la perspective du développement, non pas d'un tout petit programme d'apprentissage, mais d'un "vrai" programme au sein d'un application. Parce que le jour où tu devras le modifier, tu risques d'oublier un endroit, et d'être obligé de recommencer. Mieux le code est construit, plus facile sera une correction ou une évolution

    De la même manière, tu devrais faire davantage attention aux noms que tu emploies :
    - "mon", ce n'est pas parlant ;
    - "affichage", pour une fonction qui recopie une chaîne et retourne un booléen
    Je sais que le programme est assez artificiel, et qu'il visait pour toi à tester des fonctionnalités du langage, mais il est bon de prendre les bonnes habitudes dès le début. Le nom d'une donnée ou d'une fonction doit évoquer immédiatement, intuitivement son rôle dans le programme. Sinon, ton code sera illisible, même pour toi dans deux ou trois mois !!

Discussions similaires

  1. chaine trop longue pour envoyer en socket?
    Par jeje.r dans le forum C++Builder
    Réponses: 10
    Dernier message: 27/06/2003, 16h36
  2. Surface trop grande
    Par Black_Daimond dans le forum DirectX
    Réponses: 1
    Dernier message: 18/01/2003, 03h02
  3. Arrêter un prog si temps de connexion trop long
    Par jakouz dans le forum Langage
    Réponses: 4
    Dernier message: 22/10/2002, 18h28

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