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 :

variables globales ?


Sujet :

C

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

    Informations forums :
    Inscription : Octobre 2007
    Messages : 6
    Points : 5
    Points
    5
    Par défaut variables globales ?
    Bonjour,

    J'ai une question sur le fonctionnement de ces deux programmes utilisant des variables globales. Le but du programme est convertir un nombre de minutes au format HH:MM.

    le premier programme (qui ne fonctionne pas) est :

    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>
    #include <stdlib.h>
     
    long heures = 0, minutes = 90;
     
    void decoupeMinutes(long heures, long minutes);
     
    int main(int argc, char *argv[])
    {
     
     
    decoupeMinutes(heures, minutes);
    printf("%ld heures et %ld minutes\n", heures, minutes);
    return 0;
    }
     
    void decoupeMinutes(long heures, long minutes)
    {
    heures = minutes / 60; // 90 / 60 = 1
    minutes = minutes % 60; // 90 % 60 = 30 (rappelez-vous : modulo = reste de la division, "90 divisés par 60 font 1, et il reste 30")
    }
     
     
     
    Le second programme (qui fonctionne bien) est : 
     
    #include <stdio.h>
    #include <stdlib.h>
    long heures = 0, minutes = 90;
    void decoupeMinutes();
     
    int main(int argc, char *argv[])
    {
    decoupeMinutes();
    printf("%ld heures et %ld minutes\n", heures, minutes);
    return 0;
    }
     
    void decoupeMinutes()
    {
    heures = minutes / 60;
    minutes = minutes % 60;
    }
    Mais, je n'arrive pas à comprendre, pourquoi le premier programme ne fonctionne pas, pourtant les variable heures et minutes sont globales?

    Et pourquoi le second programme marche?
    Merci d'avance pour tout effort de collaboration.

  2. #2
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    126
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 126
    Points : 149
    Points
    149
    Par défaut
    Bonjour,

    Dans le premier programme, ta fonction a ce prototype :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void decoupeMinutes(long heures, long minutes);
    C'est à dire, qu'à son appel, des copies (locales) des deux paramètres sont effectuées. Ces deux copies sont effectivement utilisées dans le traitement de decoupeMinute. L'opération voulue se déroule normalement mais à aucun moment les deux copies locales de decoupeMinute ne viennent modifier les variables globales.

    Dans le second programme, tu réfères bien et à tout moment, à tes deux variables globales.

    Essaie de debugger pas-à-pas, tu verras précisément ce qu'il se passe.

    Cordialement,
    A.
    Un ordinateur fait au bas mot 1 million d'opérations à la seconde, mais il n'a que ça à penser, aussi. (brèves de comptoirs, JM.Gourio)


  3. #3
    Membre confirmé
    Inscrit en
    Juillet 2005
    Messages
    512
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 512
    Points : 641
    Points
    641
    Par défaut
    Car les paramètres de decoupeMinutes porte le même nom que tes variables globales et par consequents cache tes variables globales vu de l'interieur de la fonction.


    PS: Il est préférable d'éviter les variables globales

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

    Informations forums :
    Inscription : Octobre 2007
    Messages : 6
    Points : 5
    Points
    5
    Par défaut
    Citation Envoyé par Lucien63 Voir le message
    Car les paramètres de decoupeMinutes porte le même nom que tes variables globales et par consequents cache tes variables globales vu de l'interieur de la fonction.


    PS: Il est préférable d'éviter les variables globales
    Merci de m'avoir répondu. Mais je ne saisie pas bien .. mes variables globales même portant le même nom n'ont rien à voir avec les variables locales à la fonction?
    J'aimerai plus d'explication si possible.
    Quant au fait qu'il vaut mieux ne pas utiliser les variables globales. Je sus d'accord. j'aimerai juste savoir les utiliser au cas où?
    Tout en te remerciant ..

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

    Informations forums :
    Inscription : Octobre 2007
    Messages : 6
    Points : 5
    Points
    5
    Par défaut
    Citation Envoyé par agamitsudo Voir le message
    Bonjour,

    Dans le premier programme, ta fonction a ce prototype :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void decoupeMinutes(long heures, long minutes);
    C'est à dire, ....
    A.
    Merci de ta réponse. Je crois que je ne vois pas encore bien comment cela fonctionne....
    faut débugger pas à pas, c'àd avec des printf ou comment?

  6. #6
    Membre confirmé
    Inscrit en
    Juillet 2005
    Messages
    512
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 512
    Points : 641
    Points
    641
    Par défaut
    Vu differement, la fonction decoupeMinutes du 1er exemple ne sert à rien.
    - Elle ne modifie pas tes variables globales heures et minutes.
    Pourquoi elle ne les modifie pas, car ce sont les paramètres de la fonction qui sont utilisé à la place des variables globales.
    - Elle ne retourne aucun resultat.

    la fonction decoupeMinutes du deuxième exemple modifie bien les variables globales heures et minutes.

  7. #7
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 371
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 371
    Points : 23 626
    Points
    23 626
    Par défaut
    Citation Envoyé par kayma Voir le message
    Merci de m'avoir répondu. Mais je ne saisie pas bien .. mes variables globales même portant le même nom n'ont rien à voir avec les variables locales à la fonction?
    La réponse est dans ta question : si tu as d'un côté des variables locales, et de l'autre des variables globales, alors c'est qu'il s'agit bien de variables différentes :-)

    Plus précisément :

    • Les noms des paramètres n'ont pas d'importance dans le prototype lui-même. Seuls comptent leurs types ;
    • Les paramètres de ta fonction se comportent comme des variables locales ;
    • Quand tu déclares des variables locales, rien ne t'empêche d'utiliser le même nom qu'une variable déclarée à un plus haut niveau. C'est celle du niveau courant ou du plus proche parent qui sera utilisée, en remontant les multiples niveaux d'imbrications jusqu'aux variables globales.


    Exemple :

    Code C : 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
     
    int x; /* Variable globale */
     
    int fonction (int x) /* x est prioritaire sur la variable globale */
    {
         if (1>0)
         {
              int x; /* x est prioritaire sur le paramètre de la fonction */
     
                if ('b'>'a')
                {
                    int x; /* x est prioritaire sur la précédente variable */
                }
         }
     
        return 0;
    }

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

    Informations forums :
    Inscription : Octobre 2007
    Messages : 6
    Points : 5
    Points
    5
    Par défaut
    Citation Envoyé par Obsidian Voir le message
    La réponse est dans ta question : si tu as d'un côté des variables locales, et de l'autre des variables globales, alors c'est qu'il s'agit bien de variables différentes :-)

    Plus précisément :

    • Les noms des paramètres n'ont pas d'importance dans le prototype lui-même. Seuls comptent leurs types ;
    • Les paramètres de ta fonction se comportent comme des variables locales ;
    • Quand tu déclares des variables locales, rien ne t'empêche d'utiliser le même nom qu'une variable déclarée à un plus haut niveau. C'est celle du niveau courant ou du plus proche parent qui sera utilisée, en remontant les multiples niveaux d'imbrications jusqu'aux variables globales.


    Exemple :

    Code C : 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
     
    int x; /* Variable globale */
     
    int fonction (int x) /* x est prioritaire sur la variable globale */
    {
         if (1>0)
         {
              int x; /* x est prioritaire sur le paramètre de la fonction */
     
                if ('b'>'a')
                {
                    int x; /* x est prioritaire sur la précédente variable */
                }
         }
     
        return 0;
    }

    J'ai compris mon erreur. Merci à vous tous

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

Discussions similaires

  1. Variable globale / Propriété des threads
    Par rgarnier dans le forum XMLRAD
    Réponses: 4
    Dernier message: 03/10/2003, 10h49
  2. Cacher Variable Url avec Variable Globale
    Par danuz dans le forum XMLRAD
    Réponses: 6
    Dernier message: 26/09/2003, 17h20
  3. Variable "globale" (dans plusieurs templa
    Par mattmat dans le forum XSL/XSLT/XPATH
    Réponses: 3
    Dernier message: 17/06/2003, 19h22
  4. question sur les variables globales et les thread posix
    Par souris_sonic dans le forum POSIX
    Réponses: 5
    Dernier message: 13/06/2003, 13h59
  5. les variables globales static
    Par gRRosminet dans le forum C
    Réponses: 8
    Dernier message: 27/04/2002, 08h34

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