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 :

[Débutant] variable static


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau candidat au Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 2
    Par défaut [Débutant] variable static
    bonjour à tous,

    je suis entrain d'apprendre le C.
    mais je ne comprend pas un truc.
    voici le code:
    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
    #include <stdio.h>
    void function() {
    	int var = 5;
    	static int static_var = 5;
     
    	printf("\t[in function] var = %d\n", var);
    	printf("\t[in function] static_var = %d\n", static_var);
    	var++;  //ajouter 1 à var
    	static_var++;   //ajouter 1 à static_var
    }
     
    int main(){ //La fonction main, avec son propre contexte.
    	int i;
    	static int static_var = 1337; //
     
    	for(i=0; i<5; i++){ //Boucle 5 fois
    		printf("[in main] static_var = %d\n", static_var);
     		function(); //Appeler la fonction.
    	}
    }
    une variable static ne se modifie pas dans le programme si j'ai bien compris. alors comment expliquez vous qu'à la compilation la variable static_var s'incrémente?

    [in main] static_var = 1337
    [in function] var = 5
    [in function] static_var = 5
    [in main] static_var = 1337
    [in function] var = 5
    [in function] static_var = 6
    [in main] static_var = 1337
    [in function] var = 5
    [in function] static_var = 7
    [in main] static_var = 1337
    [in function] var = 5
    [in function] static_var = 8
    [in main] static_var = 1337
    [in function] var = 5
    [in function] static_var = 9
    je n'arrive pas à comprendre pourquoi la variable var (de la fonction) qui n'est pas statique, elle, ne s'incrémente pas et static_var ( de la fonction) qui est supposé être statique s'incrémente.

    Merci de m'aider à comrendre cela.

    cordialement,

    MacMini

  2. #2
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 476
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 476
    Par défaut
    Deux choses :

    • Tes variables restent des variables locales. La variabe « static_var » de ta fonction « main » n'est pas la même que celle de ta fonction « function » ;
    • Les variables dont on ne peut changer la valeur sont déclarées « const ». Les variables « static », ce sont les variables dont l'allocation est statique.


    Les variables « static » restent locales aux yeux du programmeur mais conservent quand même leur valeur d'un appel de la fonction à l'autre.

  3. #3
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par MacMini Voir le message
    une variable static ne se modifie pas dans le programme si j'ai bien compris. alors comment expliquez vous qu'à la compilation la variable static_var s'incrémente?
    Statique définit la portée du stockage...

    static signifie que la variable , locale à la fonction, est stockée statiquement, et devient donc ré-utilisable (non réinitialisée) à chaque appel de la fonction.

    C'est de la mauvaise pratique de la mettre comme ceci, et en général ça n'est utilisé que pour du debug..

    Mais de plus il y a collision de noms...

  4. #4
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Par défaut
    Citation Envoyé par souviron34 Voir le message
    Car pour la lisibilité, autant la mettre alors en static globale en tête du fichier...
    Pas tout à fait d'accord, je préfère une variable locale statique bien faite à une variable globale statique
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    void init(void)
    {
    static int _init = 0;
       if(_init != 0)
       {
          /* deja initialisé */
          return;
       }
     
       /* initialisation de mon machin */
       ...
       _init = 1;
    }
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  5. #5
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    Citation Envoyé par souviron34 Voir le message
    ....

    Mais de plus il y a collision de noms...
    Il n'y a pas de "collision" de noms ( cf le post de Obsidian)

  6. #6
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par ram-0000 Voir le message
    Pas tout à fait d'accord, je préfère une variable locale statique bien faite à une variable globale statique
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    void init(void)
    {
    static int _init = 0;
       if(_init != 0)
       {
          /* deja initialisé */
          return;
       }
     
       /* initialisation de mon machin */
       ...
       _init = 1;
    }
    Je ne suis pas d'accord.. Je trouve que c'est beaucoup beaucoup moins lisible , à la maintenance, dès que le module devient un peu gros.... Si tu n'as que 4 ou 5 fonctions, ok, ça me dérange pas. Mais si tu en as 50 ou 100, c'est comme la "règle" de ne mettre les varaibles que dans le "bloc" utile... On perd la vue d'ensemble...

    Quand tu ouvres le fichier, si l'entête du fichier est bien faite, ça te saute au yeux que cette variable est utilisée comme "globale" (qu'elle soit utilisée ou non par une seule fonction).

    M'enfin c'est une question de point de vue... ce qui n'empêche que je le déconseille ...

    Citation Envoyé par diogene Voir le message
    Il n'y a pas de "collision" de noms ( cf le post de Obsidian)
    Et ??

    De toutes façons c'est une très mauvaise pratique, surtout pour des variables statiques (qui d'ailleurs encore une fois à mon avis ne devrait être mise en usage que pour du debug provisoire, à la volée, et non comme moyen "détourné" de faire du global sans le dire).

Discussions similaires

  1. [C#] Variable static
    Par fremsoi dans le forum Windows Forms
    Réponses: 12
    Dernier message: 25/01/2006, 21h07
  2. [débutante] Variable long
    Par monia dans le forum MFC
    Réponses: 5
    Dernier message: 05/07/2005, 17h33
  3. [VB6]Initialiser une variable Static dans un évenement
    Par loverdose dans le forum VB 6 et antérieur
    Réponses: 16
    Dernier message: 20/01/2005, 14h57
  4. [héritage] héritage d'une variable static
    Par yaya44 dans le forum Langage
    Réponses: 14
    Dernier message: 29/09/2004, 13h36
  5. Variable static avec thread
    Par oxor3 dans le forum Threads & Processus
    Réponses: 7
    Dernier message: 27/08/2004, 11h45

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