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 :

Compteur, besoin d'explications


Sujet :

C++

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Etudiant en génie mécanique
    Inscrit en
    Mars 2011
    Messages
    146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Etudiant en génie mécanique

    Informations forums :
    Inscription : Mars 2011
    Messages : 146
    Points : 33
    Points
    33
    Par défaut Compteur, besoin d'explications
    Salut!
    J'ai besoin d'une explication à-propos de la fonction suivante:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    int appels(void)
    {
        static int n=0;
        return n=n+1;
    }
    Dans le cours où je l'ai trouvée, cette fonction est décrite comme un compteur d'appels, dans le sens où à la fin du programme, la variable entière "n" correspond au nombre de fois où la fonction "appels" a été appelée.
    Je comprends l'incrémentation à la deuxième ligne, mais j'ai encore un doute: comment se fait-il que la première ligne ne réinitialise pas "n" à chaque fois que le programme appelle la fonction "appels" (et qu'à la fin, "n" ait la valeur 1)?

    Qu'on m'explique: lorsqu'on déclare une variable dans une autre classe de stockage que "auto", cette déclaration ne peut être lue qu'une seule fois par le programme à chaque exécution?

    Merci pour vos réponses, bonne journée!

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 967
    Points
    32 967
    Billets dans le blog
    4
    Par défaut
    BOnjour,
    Citation Envoyé par Armulis Voir le message
    Qu'on m'explique: lorsqu'on déclare une variable dans une autre classe de stockage que "auto", cette déclaration ne peut être lue qu'une seule fois par le programme à chaque exécution?
    Quel est le sens que tu as voulu donner à cette suite de mot ???

    La "magie" réside en l'utilisation du mot-clé static. Une variable static est déclarée et initialisée une seule fois dans une méthode, lors du premier passage.
    Dans le cadre d'une classe, c'est l'équivalent d'une variable ou fonction globale (à peine) camouflée.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Etudiant en génie mécanique
    Inscrit en
    Mars 2011
    Messages
    146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Etudiant en génie mécanique

    Informations forums :
    Inscription : Mars 2011
    Messages : 146
    Points : 33
    Points
    33
    Par défaut
    Salut et merci, Bousk!

    Ma phrase bizarre signifiait que j'avais l'impression de comprendre quelque chose, mais que ça m'avait l'air suspect. Donc, je demandais une confirmation.
    La fonction "appels" que j'ai explicitée contient deux instructions: "déclaration/initialisation" et "incrémentation/renvoi"
    Je suis parfaitement au clair avec la ligne "incrémentation/renvoi", mais je ne comprends pas la ligne "déclaration/initialisation"

    Je lis la fonction comme cela:
    Lorsqu'on appelle la fonction, une variable entière "n" est créée et initialisée à la valeur zéro.
    La valeur est ensuite incrémentée de 1, puis renvoyée. Fin de la fonction.
    Mais comme la variable "n" a été déclarée dans "static", sa valeur n'est pas détruite à la fin de la fonction. Elle reste donc en l'état en attendant le prochain appel de la fonction.

    Mais lorsqu'on appellera la fonction une deuxième fois, la première ligne va réinitialiser "n" à la valeur zéro, non?

    Apparemment, ce n'est pas le cas. Ce mécanisme est-il propre à la classe "static", ou y a-t-il une règle plus générale? (et si oui, laquelle?)
    ________________

    J'en suis encore à lire mon premier cours écrit de C++, mais j'ai l'impression de commencer à comprendre un peu le fonctionnement de ce langage. J'avais un peu appris le Java avant, et fait un poil d'assembleur; ça m'a surtout appris comment fonctionnaient les machines.
    J'en suis aux classes de stockage, et l'exemple que je donne est une fonction sur laquelle j'ai buté, pour les raisons que j'explique.

  4. #4
    Membre confirmé Avatar de LinuxUser
    Inscrit en
    Avril 2007
    Messages
    857
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 857
    Points : 616
    Points
    616
    Par défaut
    Regarde le lien suivant:
    http://c.developpez.com/cours/bernar...ne/node112.php

    Tu as un problème de vocabulaire qui montre que tu n'as pas compris ce qu'est le,mot clef static.
    En effet, tu parles de classe static, classe auto, ..., alors qu'il ne s'agit pas du tout de classes, mais de types de varibles d'un point de vu de la durée de vie (comme expliqué dans le lien ci-dessus).

  5. #5
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 967
    Points
    32 967
    Billets dans le blog
    4
    Par défaut
    Pourrais-tu être plus clair ?

    classe de stockage "auto" ?
    classe static ?

    static est un mot-clé. auto en est un autre mais je doute que tu l'aies déjà rencontré.
    Peut-être qu'en avançant plus avant dans le cours ça irait mieux.
    Si en plus tu as déjà fait du JAVA, il me semble (pour ne pas dire que j'en suis certain) que static y existe aussi et a (exactement ?) la même signification.

    Pour faire simple et grossier, comme j'ai dit plus haut : une ligne static dans une fonction n'est exécutée qu'une seule fois, au premier passage.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  6. #6
    Nouveau membre du Club
    Homme Profil pro
    Etudiant en génie mécanique
    Inscrit en
    Mars 2011
    Messages
    146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Etudiant en génie mécanique

    Informations forums :
    Inscription : Mars 2011
    Messages : 146
    Points : 33
    Points
    33
    Par défaut
    Merci, c'est plus clair.

    J'avais déjà remarqué que les "classes" étaient hors de ma compréhension pour l'instant. Apparemment, on peut considérer ça comme "un type du point de vue de la durée de vie".

    En Java, on m'a juste appris où écrire static, mais on ne m'a jamais expliqué ce que ça voulait dire (Hé, c'est la Haute-école Arc, quand même, faut pas exagérer! xD)

    Je continue de lire mon cours, ne vous inquiétez pas.
    Dans mes notes, est-ce que je peux raisonnablement écrire que "toutes les lignes qui contiennent le mot-clé "static" ne sont lues qu'une seule fois par la machine"?

    Merci à toi aussi, LinuxUser!

  7. #7
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 189
    Points : 17 141
    Points
    17 141
    Par défaut
    Globalement, non, static ne signifie pas "exécuté une seule fois".

    static signifie "local à cette unité de traduction" (translation unit). ce qui se traduit par "Cher compileur, si tu rencontre un autre machin de ce nom, dans une autre unité de traduction, et bien, c'est un AUTRE machin, qui n'a rien à voir avec celui-ci."

    static était utilisé dans l'ancien temps (ou en C), à la place du namespace anonyme
    (namespace { int truc;} s'écrivait static int truc;)

    Dans une fonction, cela crée une "variable globale locale", dans le sens où la variable est comme une globale, c'est à dire instanciée une seule fois, mais visiblement uniquement dans cette fonction.

    En java, static signifie "appartient à la classe, et non à l'objet". Je ne pense pas qu'on puisse créer une variable static dans une méthode, mais je ne le promets pas…

    En C++, static apparait dans trois contextes distincts:
    • devant une déclaration, dans un namespace (ou en global), pour signifier "le déclaré est local à l'unité de traduction"
    • devant une déclaration de variable, dans une fonction, pour signifier mon "variable globale locale".
    • devant une déclaration, dans une classe (ou structure), pour les déclarations liées à la classe et donc commune à chacune des instances.

    Le premier usage devrait être remplacé par le namespace anonyme.
    Le second est rare, très rare.
    Le troisième est l'usage majoritaire.
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

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

Discussions similaires

  1. besoin d'explication sur le c++
    Par poporiding dans le forum MFC
    Réponses: 13
    Dernier message: 17/12/2005, 18h01
  2. Besoin d'explications sur un bout de code
    Par zizitop dans le forum C
    Réponses: 7
    Dernier message: 26/04/2005, 14h51
  3. [C#] J'aurais besoin d'explication
    Par Roach- dans le forum Windows Forms
    Réponses: 18
    Dernier message: 10/03/2005, 16h00
  4. Besoin d'explications sur float et l'élasticité !
    Par KneXtasY dans le forum Mise en page CSS
    Réponses: 2
    Dernier message: 14/01/2005, 15h15
  5. [Foreign Key] Besoin d'explication.
    Par Andry dans le forum Débuter
    Réponses: 4
    Dernier message: 28/05/2003, 11h34

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