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 :

Explication portée des définitions


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 35
    Par défaut Explication portée des définitions
    Bonjour, je suis débutant en train d'apprendre le C, donc excusez moi si ma question vous parait idiote (on dit chez moi que le ridicule ne tue pas).

    J'utilise gcc 4.0.1 sous Mandriva pour les détails.

    Voila, donc j'essayais de comprendre comment pouvaient être interprétées des erreurs de programmaion au niveau des portées des variables avec un petit programme que voici

    Voici la version 1 du programme :
    Code variable_globale_main.c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    #include <stdlib.h>
    #include "variable_globale.h"
     
    float globale;
     
    int
    main(void)
    {
            variable_globale_afficher();
            globale = 132456789.0;
            variable_globale_afficher();
            return EXIT_SUCCESS;
    }

    Code variable_globale.c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    #include <stdio.h>
    #include "variable_globale.h"
     
    extern int globale;
     
    void
    variable_globale_afficher(void)
    {
            printf("globale = %d\n", globale);
    }

    Code variable_globale.h : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    #ifndef VARIABLE_GLOBALE_H
    #define VARIABLE_GLOABLE_H
     
    extern void variable_globale_afficher(void);
     
    #endif  /* VARIABLE_GLOBALE_H */

    Résultat obtenu :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    globale = 0
    globale = 1291625515
    Là, ok, y a pas de problème, étant donné que la variable est donnée comme étant float dans variable_globale_main.c et traitée comme int dans variable_globale.c, il est tout à fait normal, comme le codage est différent, que la variable soit "mal affichée".

    Mais voici la version 2 de mon programme ou je ne change que variable_globale.c

    Code variable_globale.c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    #include <stdio.h>
    #include "variable_globale.h"
     
    extern int globale;
     
    void
    variable_globale_afficher(void)
    {
            printf("globale = %f\n", globale);
    }

    Alors la, le résultat me surprend
    Déjà, dès la compilation, j'obtiens ce message d'erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    [revenge@localhost 02_declarations]$ gcc -g -W -Wall variable_globale_main.c variable_globale.c -o variable_globale
    variable_globale.c: In function 'variable_globale_afficher':
    variable_globale.c:9: warning: format '%f' expects type 'double', but argument 2 has type 'int'
    Je ne comprends pas, je n'obtenais aucune erreur lors de la première version qui, dans le second appel de fonction, prend un float pour le mettre en int (avec %d). Pourquoi ce message d'erreur là et pas dans la première version ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    [revenge@localhost 02_declarations]$ ./variable_globale
    globale = -0.400362
    globale = -0.400362
    [revenge@localhost 02_declarations]$ ./variable_globale
    globale = -0.012160
    globale = -0.012160
    [revenge@localhost 02_declarations]$ ./variable_globale
    globale = -0.819881
    globale = -0.819882
    [revenge@localhost 02_declarations]$ ./variable_globale
    globale = -0.023486
    globale = -0.023486
    La aussi, je ne comprends pas, je mets deux valeurs différentes et j'obtiens deux valeurs identiques qui, en plus de ca, diffèrent a chaque exécution du programme.

    Voila, donc si quelqu'un d'assez courageux pouvait m'expliquer comment cela se fait il ??? En gros, comment le compilateur gère la variable globale et quel type il lui donne pour chaque appel ?

    En vous remerciant de votre attention !!

  2. #2
    Membre Expert
    Inscrit en
    Décembre 2004
    Messages
    1 478
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 478
    Par défaut
    Dans ta deuxieme tentative, tu donnes a printf() un formatteur pour float (%f), mais ta variable globale est toujours de type int. Alors il se plaint. Il faut donc aussi modifier ton
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    extern int globale;
    en
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    extern float globale;

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 35
    Par défaut
    Merci à vous, c'est cool, ca a bien répondu à ma question.

  4. #4
    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 4R416N33²
    Voila, donc j'essayais de comprendre comment pouvaient être interprétées des erreurs de programmaion au niveau des portées des variables avec un petit programme que voici

    Voici la version 1 du programme :
    Code variable_globale_main.c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    #include <stdlib.h>
    #include "variable_globale.h"
     
    float globale;
     
    int
    main(void)
    {
            variable_globale_afficher();
            globale = 132456789.0;
            variable_globale_afficher();
            return EXIT_SUCCESS;
    }

    Code variable_globale.c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    #include <stdio.h>
    #include "variable_globale.h"
     
    extern int globale;
     
    void
    variable_globale_afficher(void)
    {
            printf("globale = %d\n", globale);
    }

    Code variable_globale.h : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    #ifndef VARIABLE_GLOBALE_H
    #define VARIABLE_GLOABLE_H
     
    extern void variable_globale_afficher(void);
     
    #endif  /* VARIABLE_GLOBALE_H */
    Ce code est très faux. En effet, d'un coté, tu as une variable qui est définie de type float :
    d'autre part, tu fait croire à ton compilateur qu'elle a le type int :
    Le comportement est indéfini. Il n'y a rien à expliquer concernant le résultat d'un comportement indéfini. Il aurait être correct, c'est ça qui est grave.

    Le compilateur de voit rien car tu as brisé un certain nombre de règles de codages, voire de conception (globales, pourquoi faire ?).

    Mais voici la version 2 de mon programme ou je ne change que variable_globale.c

    Code variable_globale.c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    #include <stdio.h>
    #include "variable_globale.h"
     
    extern int globale;
     
    void
    variable_globale_afficher(void)
    {
            printf("globale = %f\n", globale);
    }

    Alors la, le résultat me surprend
    Déjà, dès la compilation, j'obtiens ce message d'erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    [revenge@localhost 02_declarations]$ gcc -g -W -Wall variable_globale_main.c variable_globale.c -o variable_globale
    variable_globale.c: In function 'variable_globale_afficher':
    variable_globale.c:9: warning: format '%f' expects type 'double', but argument 2 has type 'int'
    Je ne comprends pas, je n'obtenais aucune erreur lors de la première version qui, dans le second appel de fonction, prend un float pour le mettre en int (avec %d). Pourquoi ce message d'erreur là et pas dans la première version ?
    Parce que le type attendu par printf() était avant int ("%d"), en cohérence avec le type déclaré, alors qu'il est maintenant double ("%f"), ce qui n'est plus conforme au type, qui est toujours int. Tu as la chance d'avoir un gcc bien configuré qui te montre le problème. Peu de compilateurs savent faire ça.

    Le comportement est toujours aussi indéterminé et le code est toujours aussi incorrect.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    [revenge@localhost 02_declarations]$ ./variable_globale
    globale = -0.400362
    globale = -0.400362
    [revenge@localhost 02_declarations]$ ./variable_globale
    globale = -0.012160
    globale = -0.012160
    [revenge@localhost 02_declarations]$ ./variable_globale
    globale = -0.819881
    globale = -0.819882
    [revenge@localhost 02_declarations]$ ./variable_globale
    globale = -0.023486
    globale = -0.023486
    La aussi, je ne comprends pas, je mets deux valeurs différentes et j'obtiens deux valeurs identiques qui, en plus de ca, diffèrent a chaque exécution du programme.
    Explication déjà donnée. (Un parfait exemple de comportement indéfini sans effet visible ... aujourd'hui)

    Pour coder correctement :

    http://emmanuel-delahaye.developpez.com/codage.htm
    http://emmanuel-delahaye.developpez....s.htm#globales

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

Discussions similaires

  1. Réponses: 8
    Dernier message: 17/02/2005, 09h05
  2. [FLASH MX] Portée des variables ???
    Par mic79 dans le forum Flash
    Réponses: 2
    Dernier message: 08/02/2005, 10h21
  3. Portée des variables vbscript vers ASP
    Par Immobilis dans le forum ASP
    Réponses: 3
    Dernier message: 03/11/2004, 10h14
  4. [XSL]Problème de portée des variables
    Par djulesp dans le forum XSL/XSLT/XPATH
    Réponses: 6
    Dernier message: 17/09/2004, 10h34
  5. [Portée] portée des variables
    Par parksto dans le forum Langage
    Réponses: 7
    Dernier message: 09/05/2004, 21h05

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