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 :

definition d'une constante static


Sujet :

C++

  1. #1
    Membre du Club
    Inscrit en
    Octobre 2006
    Messages
    114
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 114
    Points : 44
    Points
    44
    Par défaut definition d'une constante static
    je voudrais savoir la syntaxe pour definir une constante static de type unsigned char dans une fonction. je le fais parce que je ne veux pas utiliser de variable globale

  2. #2
    Membre régulier
    Inscrit en
    Janvier 2006
    Messages
    74
    Détails du profil
    Informations personnelles :
    Âge : 54

    Informations forums :
    Inscription : Janvier 2006
    Messages : 74
    Points : 84
    Points
    84
    Par défaut
    Hum,
    me semble un peu paradoxal...
    Une constante ne peut pas etre modife et ce trouve en ROM.
    Une static est une variable modifiable et ce trouve en RAM.
    Je pense que tu dois te tromper quelque part...
    Salutations

  3. #3
    Membre averti
    Inscrit en
    Novembre 2006
    Messages
    362
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 362
    Points : 410
    Points
    410
    Par défaut
    C'est exactement comme quand tu le dis, il faut préciser :
    - que son type est unsigned char
    - qu'elle est constante
    - qu'elle est statique

    Tu peux faire comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    void mamethode()
    {
    	const static unsigned char uc = 7;
    }
    Note : il te faut l'initialiser dans la foulée, car elle est constante (et que tu ne pourras donc pas le faire plus tard)

    Citation Envoyé par emardjean
    Une static est une variable modifiable et ce trouve en RAM.
    Sauf quand elle est const.

  4. #4
    Membre régulier
    Inscrit en
    Janvier 2006
    Messages
    74
    Détails du profil
    Informations personnelles :
    Âge : 54

    Informations forums :
    Inscription : Janvier 2006
    Messages : 74
    Points : 84
    Points
    84
    Par défaut
    hum,
    Quel est l'interet ?
    Salutation

  5. #5
    Membre averti
    Inscrit en
    Novembre 2006
    Messages
    362
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 362
    Points : 410
    Points
    410
    Par défaut
    un des intérêts c'est que dans le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    void mamethode()
    {
    	const static unsigned char uc = 7;
     
    	fait_quelque_chose_avec_ceci(uc);
    	fait_autre_chose_avec_ceci(uc);
    	va_ceuillir_des_noisettes(uc);
    	range_tes_oreilles(uc);
    	ne_touche_pas_au_chocolat(uc);
    }
    On génère le même exécutable que dans
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    void mamethode()
    {
    	fait_quelque_chose_avec_ceci(7);
    	fait_autre_chose_avec_ceci(7);
    	va_ceuillir_des_noisettes(7);
    	range_tes_oreilles(7);
    	ne_touche_pas_au_chocolat(7);
    }
    Mais cela se modifie plus facilement.

    Bonne journée.

  6. #6
    Membre régulier
    Inscrit en
    Janvier 2006
    Messages
    74
    Détails du profil
    Informations personnelles :
    Âge : 54

    Informations forums :
    Inscription : Janvier 2006
    Messages : 74
    Points : 84
    Points
    84
    Par défaut
    Ok,
    En C++, on remplace les #define par des const static,
    désolé pour mes remarques désagreables

  7. #7
    Membre averti
    Inscrit en
    Novembre 2006
    Messages
    362
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 362
    Points : 410
    Points
    410
    Par défaut
    Citation Envoyé par emardjean
    Ok,
    En C++, on remplace les #define par des const static,
    désolé pour mes remarques désagreables
    Tu peux aussi utiliser les #define, la plupart du temps le résultat est similaire.

    Cependant, le #define n'est pas typé, donc le comportement peut être distinct dans ce cas-là par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    #define i2 4;
    void m1(unsigned int i) // cette méthode prend un unsigned int
    {
    ...
    }
    void m2()
    {
       const static int i1 = 4;
       m1(i1);  // ceci déclenche un warning de compatibilité
       m1(i2);  // ceci non
    }

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    394
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 394
    Points : 473
    Points
    473
    Par défaut
    Je mettrais un bémol, néanmoins. Définir la constante comme static n'apporte rien dans l'exemple.
    L'interêt d'une variable de fonction déclarée 'static' est que cela permet de préserver sa valeur entre les appels successifs de la fonction.
    Si cette dernière est constante, conserver sa valeur est sans objet.

    Bien sûr 'static' n'a pas le même sens lors d'une déclaration de variable en dehors d'une fonction.

    Pour ce qui est d'écrire la valeur des constantes dans la ROM. J'espère que c'est un abus de langage...

  9. #9
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    633
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 633
    Points : 711
    Points
    711
    Par défaut
    Bonjour,

    Nul ne doute de l'intérêt de déclarer des constantes plutôt que de coder des valeurs en clair, comme tu l'as bien noté.

    Par contre, j'aimerais savoir pourquoi tu tiens à ce qu'elle soit static : ça n'amène absolument rien de plus à son utilisation.

    Et globalement, constante ou variable, le tout est en RAM. Qui vous a mis en tête qu'une constante était en ROM ?
    Désolé, mais ce sigle fait référence à un type de mémoire physique, pas au fait qu'un élément d'un programme n'est pas modifiable.
    De plus, pour certains compilateurs (tous ?), une constante n'est même pas en mémoire à un endroit précis, elle est codée en dur dans l'exécutable.
    Compilation sans erreur ne signifie pas programme sans erreur.
    L'indentation n'a pas été imaginée pour faire beau, mais pour faciliter la lecture des programmes.

  10. #10
    Membre averti
    Inscrit en
    Novembre 2006
    Messages
    362
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 362
    Points : 410
    Points
    410
    Par défaut
    Citation Envoyé par thewho
    Bonjour,
    Nul ne doute de l'intérêt de déclarer des constantes plutôt que de coder des valeurs en clair, comme tu l'as bien noté.
    Par contre, j'aimerais savoir pourquoi tu tiens à ce qu'elle soit static : ça n'amène absolument rien de plus à son utilisation.
    Effectivement, je ne voie pas de différence induite par le fait qu'elle soit statique ... Dans tous les cas, elle est en dur dans le programme et non pas en mémoire.

    Après, d'un point de vue philosophique, peut-être est-ce que le "static" insiste sur le fait qu'il s'agit de la même constante pour toutes les méthodes... ce qui pourrait être utile par exemple si quelqu'un décide un jour de modifier le code et de la rendre non-statique.

  11. #11
    r0d
    r0d est déconnecté
    Expert éminent

    Homme Profil pro
    tech lead c++ linux
    Inscrit en
    Août 2004
    Messages
    4 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : tech lead c++ linux

    Informations forums :
    Inscription : Août 2004
    Messages : 4 262
    Points : 6 680
    Points
    6 680
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Jan Rendek
    L'interêt d'une variable de fonction déclarée 'static' est que cela permet de préserver sa valeur entre les appels successifs de la fonction.
    Si cette dernière est constante, conserver sa valeur est sans objet.
    Ce n'est pas exact. Testez le code suivant et vérifiez la valeur de i à chaque étape pour vous en convaincre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    void toto(int i)
    {
    	i=3;
    }
     
    int _tmain(int argc, _TCHAR* argv[])
    {
    	int i = 4;
    	toto(i);
     
    	return 0;
    }
    * Ici, la valeur de i restera à 4 aprés l'appel de toto(i); donc rien à voir avec static.
    * Pas besoin de définir i comme constante pour que la valeur ne soit pas modifiée (tant qu'elle reste dans sa portée).

    En fait, le mot clé static ne doit pas être utilisé dans ce sens en c++. Il sert à définir des variables membres communes à toutes les instances d'une classe, et permet de faire des choses du style: int UnInt = UneClasse::UneValeur; sans avoir à instancier UneClasse.
    « L'effort par lequel toute chose tend à persévérer dans son être n'est rien de plus que l'essence actuelle de cette chose. »
    Spinoza — Éthique III, Proposition VII

  12. #12
    Membre averti
    Inscrit en
    Novembre 2006
    Messages
    362
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 362
    Points : 410
    Points
    410
    Par défaut
    Citation Envoyé par r0d
    Ce n'est pas exact
    Je crois que ce que thewho voulait dire c'est que le code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    void toto()
    {
    	static int i=3;
    	std::cout << i++ << " ";
    }
    int _tmain(int argc, _TCHAR* argv[])
    {
    	toto();
    	toto();
    	toto();
    	return 0;
    }
    Produit la sortie suivante :
    3 4 5

  13. #13
    Rédacteur

    Avatar de millie
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    7 015
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 015
    Points : 9 818
    Points
    9 818
    Par défaut
    Citation Envoyé par r0d
    Ce n'est pas exact.
    Je pense que Rendek parlait d'un code comme ceci :
    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
     
    int generer()
    {
     static int i = 0;
     return i++;
    }
     
    int main(void)
    {
      int i;
      int j;
     
      i = generer();
      j = generer();
     
     return 0;
    }
    Je ne répondrai à aucune question technique en privé

  14. #14
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    394
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 394
    Points : 473
    Points
    473
    Par défaut
    Il n'y a pas de définition de variable de fonction 'static' dans l'exemple.
    Voila un exemple de mise en oeuvre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    #include <iostream>
    using namespace std;
    void f()
    {
      static int count=0;
      ++count;
      cout << "Nb d'appels de la fct: " << count << endl;
    }
     
    int main()
    {
      for (int i=0; i < 10; ++i)
            f();
    }

    En fait, le mot clé static ne doit pas être utilisé dans ce sens en c++. Il sert à définir des variables membres communes à toutes les instances d'une classe, et permet de faire des choses du style: int UnInt = UneClasse::UneValeur; sans avoir à instancier UneClasse
    C'est une des utilisations du mot-clefs 'static', mais sûrement pas la seule. Personnellement j'en vois 4, et peut-être j'en ignore d'autres.

  15. #15
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Ouah, un triple-cross!

    Il me semble que la remarque de r0d concerne les static const ... dans une fonction. Il est raisonnable de penser que du moment que la "variable" est const, le fait qu'elle soit static ou non importe peu (du moins, dans le cas d'un type primitif. Pour un objet avec constructeur, la différence est notable).
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  16. #16
    Membre habitué
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Décembre 2005
    Messages
    109
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Décembre 2005
    Messages : 109
    Points : 161
    Points
    161
    Par défaut
    Citation Envoyé par Médinoc
    Il est raisonnable de penser que du moment que la "variable" est const, le fait qu'elle soit static ou non importe peu (du moins, dans le cas d'un type primitif. Pour un objet avec constructeur, la différence est notable).
    Même si des cas présentant cette situation (surtout avec des types primitifs) sont probablement extrèmement rares, le programme suivant semble dire le contraire :

    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
    #include <iostream>
     
    void print(int const * ptr)
    {
    	std::cout << static_cast<void const *>(ptr) << std::endl;
    }
     
    void foo(bool repeat)
    {
    	static const int i = 2;
    	print(&i);
    	if (repeat) foo(false);
    }
     
    void bar(bool repeat)
    {
    	const int i = 3;
    	print(&i);
    	if (repeat) bar(false);
    }
     
    int main(void)
    {
    	foo(true);
    	bar(true);
    }
    Compilé avec mingw/g++(3.4.5), donne le résultat suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $ g++ un_test.cpp -o un_test -Wall -ansi -pedantic -O3
    $ ./un_test     
    0x43e000
    0x43e000
    0x22ff74
    0x22ff40

  17. #17
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    633
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 633
    Points : 711
    Points
    711
    Par défaut
    Bonjour,
    Citation Envoyé par Feriaman
    Effectivement, je ne voie pas de différence induite par le fait qu'elle soit statique ... Dans tous les cas, elle est en dur dans le programme et non pas en mémoire.

    Après, d'un point de vue philosophique, peut-être est-ce que le "static" insiste sur le fait qu'il s'agit de la même constante pour toutes les méthodes... ce qui pourrait être utile par exemple si quelqu'un décide un jour de modifier le code et de la rendre non-statique.
    Étant définie dans une fonction, sa portée est limitée à cette fonction

    Citation Envoyé par Feriaman
    e crois que ce que thewho voulait dire c'est que le code
    J'aimerais bien connaître la suite de réflexions qui te conduit à ça par rapport à ce que j'ai écrit.

    Citation Envoyé par r0d
    * Ici, la valeur de i restera à 4 aprés l'appel de toto(i); donc rien à voir avec static.
    * Pas besoin de définir i comme constante pour que la valeur ne soit pas modifiée (tant qu'elle reste dans sa portée).
    Encore heureux, tu la passes par valeur à une fonction, qui travaille donc sur une copie locale.
    Mais passe-la par erreur à une fonction qui va la prendre en référence, et tu verras, alors que définie comme const, tu auras au minimum ton compilateur qui va te rappeler à l'ordre.
    Compilation sans erreur ne signifie pas programme sans erreur.
    L'indentation n'a pas été imaginée pour faire beau, mais pour faciliter la lecture des programmes.

  18. #18
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    394
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 394
    Points : 473
    Points
    473
    Par défaut
    Il ne faut pas tout confondre. Un compilateur, d'abord il compile et ensuite il optimise. Pour toute variable, il alloue un espace mémoire pour y stocker sa valeur.
    Dans la passe d'optimisation, s'il détecte qu'on utilise jamais l'adresse d'une variable constante (et quelques autres tests) alors il peut choisir d'uniquement copier la valeur de cette constante. En d'autre terme UNIQUEMENT si les conditions sont réunies, une variable scalaire constante sera remplacée par sa valeur 'immédiate'.

    A partir du moment ou dans ton code tu demandes explicitement l'adresse de la variable, le compilateur sera forcé de lui allouer un espace mémoire. En bref, ton test ne prouve rien.
    Si tu veux voir cette optimisation à l'oeuvre, il te faudra écrire un bout de code qui l'autorise et regarder l'assembleur généré.

  19. #19
    Membre averti
    Inscrit en
    Novembre 2006
    Messages
    362
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 362
    Points : 410
    Points
    410
    Par défaut
    Bonjour, bonjour,

    Citation Envoyé par thewho
    Étant définie dans une fonction, sa portée est limitée à cette fonction
    Je l'entend bien, mais je ne voie pas ce que cela vient faire ici.
    La portée d'une variable de méthode statique est bien cette méthode et uniquement cette méthode, mais il n'existe qu'une seule variable statique pour tous les appels de cette méthode, et elle garde sa valeur d'un appel sur l'autre.

    Pour éclairer le point que tu cite, je disais donc que si cela ne change rien de déclarer statique une variable constante d'un type primitif, cela peut éclairer sur les intentions de l'auteur du code.
    Imaginons un jeu en mode console, où chaque objet de jeu connait le symbole qui le représente à l'écran. On peut vouloir utiliser une variable "static const char" pour le symbole en question. Non pas que cela change grand chose par rapport à un "const char", mais si un jour on rend le programme paramétrable de sorte que l'utilisateur puisse choisir les symboles des objets, ces variables ne seront plus "const", mais toujours "static".
    Enfin, ceci est une considération plus psychologique ou philosophique que génie logiciel, je l'accorde volontiers.

    Citation Envoyé par thewho
    J'aimerais bien connaître la suite de réflexions qui te conduit à ça par rapport à ce que j'ai écrit.
    Toutes mes excuses, je me suis trompé de citation. Il fallait donc lire :
    Je crois que ce que Jean Rendek voulais dire
    et non pas
    Je crois que ce que thewho voulais dire
    .

  20. #20
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    633
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 633
    Points : 711
    Points
    711
    Par défaut
    Bonjour,

    Arrêtez de nous parler de variable, il s'agit d'une constante.

    Et le cas est très différent.
    Compilation sans erreur ne signifie pas programme sans erreur.
    L'indentation n'a pas été imaginée pour faire beau, mais pour faciliter la lecture des programmes.

Discussions similaires

  1. [Debutant]Definition d'une constante.
    Par GETah dans le forum Langage
    Réponses: 6
    Dernier message: 18/05/2005, 19h16
  2. [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
  3. [héritage] héritage d'une variable static
    Par yaya44 dans le forum Langage
    Réponses: 14
    Dernier message: 29/09/2004, 13h36
  4. ajout d'une constante dans un select
    Par Shabata dans le forum Langage SQL
    Réponses: 3
    Dernier message: 01/07/2004, 18h24
  5. Partage d'une constante entre 2 fichiers en C
    Par elsargento dans le forum C
    Réponses: 6
    Dernier message: 29/09/2003, 22h17

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