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 locales ou globales ???


Sujet :

C

  1. #1
    Membre régulier Avatar de elvivo
    Inscrit en
    Mai 2002
    Messages
    105
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 105
    Points : 104
    Points
    104
    Par défaut variables locales ou globales ???
    Salut,

    Je me demandais si il fallait mieux utiliser des variables locales ou globales.
    Quelles sont leurs diffences (taille memoire, vitesse, etc ??

    Merci.
    In code we trust !!

  2. #2
    Bob
    Bob est déconnecté
    Membre éclairé
    Avatar de Bob
    Inscrit en
    Mars 2002
    Messages
    115
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 115
    Points : 866
    Points
    866
    Par défaut Variables locales ou globales
    Il y a plusieurs differences entre les variables locales et globales.
    De maniere general, il vaut mieux utiliser des variables locales si tu le peux.
    Si tu cre 2 fonctions, elles peuvent avoir les memes variables locales (meme noms). Car si 2 fonctions utilisent les meme variables globales, et que l'une appele l'autre, la variable globale vas etre modifiee et lorsque la premiere fonction vas continuer son execution, elle risque de planter car sa variable aura ete modifiee...
    De plus, les variables locales sont detruites a la fin de la fonction, ce qui economise la memoire. Les variables globales sont alouees pour toute la duree de l'application.
    Si tu utilise un tres grand tableau de maniere tres frequent, il vaut alors mieux le mettre en variable globale, ca evite de faire des allocations/desallocations de mamoires trop frequament.

    Mais en regle general, il ne faut pas utiliser les variables globales lorsque ca n'est pas oblige.

    Pour te perfectionner en langage C, voir les tutoriels et cours de C : http://c.developpez.com/cours/
    Bob, Rédacteur C/C++ & PHP
    http://bob.developpez.com/

  3. #3
    Membre émérite

    Homme Profil pro
    Urbaniste
    Inscrit en
    Mars 2002
    Messages
    255
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : Urbaniste

    Informations forums :
    Inscription : Mars 2002
    Messages : 255
    Points : 2 717
    Points
    2 717
    Par défaut
    Le mieux étant de n'utilise aucune variable globale ... mais c'est assez utopique. Ca devient vite le bordel si il y a trop de variables globales. Disons qu'il ne faut passer en global que les variables utilisées dans de très nombreuses fonctions.

    Dans ma calculatrice, j'ai quelques variables globales :
    - Liste des variables, fonctions, constantes, etc.
    - Indicateur pour dire si une allocation de mémoire est locale (juste pour un calcul) ou global (principalement dans les listes) -> C'est pour tester les fuites de mémoire

    Pour charger un fichier de configuration .INI par exemple, je crée une classe (je programme en C++) qui contient des variables dont j'ai besoin uniquement pour ke chargement du fichier, je charge le fichier, puis je détruit la classe.

    Après ça, tu t'arranges comme tu veux ... tant que le code reste compréhensible :D

    @+ Haypo

  4. #4
    HRS
    HRS est déconnecté
    Membre confirmé
    Avatar de HRS
    Inscrit en
    Mars 2002
    Messages
    677
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 677
    Points : 638
    Points
    638
    Par défaut
    surtout ne jamais décrire des variables dans des fichiers .h

    car tout le monde y a accès et tout le monde peut les modifier

  5. #5
    Bob
    Bob est déconnecté
    Membre éclairé
    Avatar de Bob
    Inscrit en
    Mars 2002
    Messages
    115
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 115
    Points : 866
    Points
    866
    Par défaut variables globales
    A mon avis, dans le cas d'utilisation de variables globales un peu nombreuses, le mieux est de les regroupper par themes dans des structures. Ca clarifie enormement le programme, ainsi que sa comprehension. De plus, la manipulation est plus facile.
    Par ex, je cree ds mes programme un structure OPTIONS qui contient toutes les options qui doivent ete accessibles de l'ensemble du programme.
    Bob, Rédacteur C/C++ & PHP
    http://bob.developpez.com/

  6. #6
    Membre émérite

    Homme Profil pro
    Urbaniste
    Inscrit en
    Mars 2002
    Messages
    255
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : Urbaniste

    Informations forums :
    Inscription : Mars 2002
    Messages : 255
    Points : 2 717
    Points
    2 717
    Par défaut
    Pour mettre des variables dans les .h, faut rajouter "extern", ex:
    liste.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    ...
    typedef Element *Liste;
    extern Liste MaListe;
    ...
    liste.c
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    ...
    Liste MaListe;
    ...
    Comme ça tout le monde peut accéder à la liste, mais il n'y en a qu'une physiquement (sinon chaque fois que tu inclus ton .h tu auras une nouvelle variable MaListe, gros problème au linkage).

    Bon, bien sûr, c'est un variable globale, faut en juger l'utilité : pourquoi pas plutôt une local ...

    @+ Haypo

  7. #7
    Membre chevronné
    Avatar de Geronimo
    Profil pro
    Inscrit en
    Avril 2002
    Messages
    156
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2002
    Messages : 156
    Points : 1 969
    Points
    1 969
    Par défaut
    On peut aussi regrouper les variables dans des espaces de noms, et non des structures :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    namespace Variables_globales
    {
       int Ma_variable;
    }
     
    Variables_globales::Ma_variable = 0;
    Une question concernant C++Builder ? Voici la réponse
    Consultez aussi les tutoriels de qualité de la section C/C++

  8. #8
    Ol'
    Ol' est déconnecté
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    56
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 56
    Points : 69
    Points
    69
    Par défaut
    Salut,

    Je voulais préciser qu'une différence IMPORTANTE entre les variables locale et les variables locales est qu'elles sont gérées de manière complètement différente par le compilateur

    Les variables locales sont mises sur la pile alors que les variables globales sont mises sur le tas. Il peut donc être intéressant d'utiliser des variables globales quand tu as beaucoup de variables et que tu risques le dépassement de pile. Tu remarqueras que les variables locales auxquelles on attribue une valeur directement int i=2; sont elles aussi mises sur le tas, c'est toujours ça de pris.

    Toutefois, ce problème est moins crucial que dans d'autres langages (VB où le type variant favorise le remplissage rapide de la pile ;-))

    Voila
    Ol'

  9. #9
    fd
    fd est déconnecté
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    131
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 131
    Points : 162
    Points
    162
    Par défaut pile, tas etc...
    Désolé les var globales ne sont mises sur le tas qu'en cas d'allocation mémoire.
    Sinon elles sont mises dans 2 sections de données :
    l'une pour les var non initialisées
    l'autre pour les var initialisées

  10. #10
    Membre averti
    Homme Profil pro
    Inscrit en
    Avril 2002
    Messages
    290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2002
    Messages : 290
    Points : 325
    Points
    325
    Par défaut
    Attention, certaines methodes proposées relevent du C++ et non du C
    c'est le cas du namespace a moins qu'il ne soit dans la norme C99...

    C'est aussi le cas de ce dont parle haypo : le extern n'est pas indispensable en C, chaque déclaration étant un essai de déclaration, il l'est par contre en C++. Si on utilise la technique du extern, il doit y avoir au moins une déclaration sans le extern.

    Les variables locales sont toujours mises sur la pile, meme quand elle sont initialisées. Par contre une "locale" static, est en fait une globale, et dans donc gérée comme telle.

    Effectivement les globales ne sont pas sur le tas, qui est resevé normalement à l'allocation dynamique, mais comme le tas elles ont une durée de vie qui est la meme que celle du programme contrairement aux variables locales.

  11. #11
    Membre régulier Avatar de elvivo
    Inscrit en
    Mai 2002
    Messages
    105
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 105
    Points : 104
    Points
    104
    Par défaut
    Merci pour toutes ces infos
    In code we trust !!

  12. #12
    Candidat au Club
    Inscrit en
    Mai 2002
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 2
    Points : 2
    Points
    2
    Par défaut C quoi
    Désolé de mon ignorance mais c'est quoi une variable sur le tas??
    autodidacte sans diplôme et fier de l'être

    http://www.leslangagesweb.fr.st
    cabossdur: rayannos@aol.com

  13. #13
    Membre averti

    Inscrit en
    Juin 2002
    Messages
    97
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 97
    Points : 307
    Points
    307
    Par défaut
    Citation Envoyé par Gandalf
    Effectivement les globales ne sont pas sur le tas, qui est resevé normalement à l'allocation dynamique, mais comme le tas elles ont une durée de vie qui est la meme que celle du programme contrairement aux variables locales.
    Euh... les variables de tas ne sont jamais détruites, contrairement aux globales qui le sont à la fin du programme.
    Nuance subtile, mais très importante.

    cabossdur:Le tas, c'est la zone mémoire où ont lieu les allocations faites par malloc ou new.
    Ces allocations/variables ne sont libérées/détruites qu'avec free ou delete.
    Bien sûr, la mémoire est quand même libérée quand l'executable quitte, mais alors c'est sauvage.
    "J'ai toujours rêvé d'un ordinateur qui soit aussi facile à utiliser qu'un téléphone. Mon rêve s'est réalisé : je ne sais plus comment utiliser mon téléphone."-Bjarne Stroustrup
    www.stroustrup.com

  14. #14
    Candidat au Club
    Inscrit en
    Mai 2002
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 2
    Points : 2
    Points
    2
    Par défaut Cool
    Voilà une réponse claire, nette et précise comme je les aime.

    Merci beaucoup à toi
    autodidacte sans diplôme et fier de l'être

    http://www.leslangagesweb.fr.st
    cabossdur: rayannos@aol.com

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

Discussions similaires

  1. [Débutant] transformer une variable local en global d'une fonction
    Par bibed dans le forum MATLAB
    Réponses: 3
    Dernier message: 13/11/2009, 22h04
  2. Réponses: 7
    Dernier message: 15/11/2007, 14h41
  3. Réponses: 2
    Dernier message: 30/09/2007, 14h35
  4. Variable, local ou global ?
    Par Expender dans le forum Débuter
    Réponses: 4
    Dernier message: 11/06/2007, 16h12
  5. variables locales ou globales?
    Par molesqualeux dans le forum C
    Réponses: 20
    Dernier message: 09/11/2005, 23h03

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