Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1566 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  question sur static

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

question sur static

n°2043759
in_your_ph​ion
Posté le 22-12-2010 à 15:59:42  profilanswer
 

bonjour,
Il y a quelque chose que je ne comprend pas avec le mot clé "static".

 

Dans le cas où c'est utilisé dans un bloc de code (hors membre ou fonction de classe), il me semble que c'est une variable qui est initialisée au linkage du programme, soit avant même l'exécution, et que l'adresse est toujours la même.

 

Dans ce cas, il me semble aussi qu'il est possible de changer changer la valeur de cette variable, par exemple :

 
Code :
  1. static int a = 10;
  2. //du code
  3. a = 12; //'a' vaut maintenant 12

 

Or, avec un appel de fonction, ce n'est pas possible, la valeur est toujours la même...Par exemple :

Code :
  1. static int a = toto(); //toto() est une fonction qui renvoie un nombre entier aléatoire, ici par exemple c'est 10
  2. a = toto(); //ici, la fonction n'est même pas appelée, au débugger on ne rentre pas dedans.
 

Pourquoi est ce que c'est comme ça ? c'est pourtant là aussi une affectation de valeur ....c'est ça que je ne comprend pas.

 

Par ailleurs, est ce qu'une variable globale est "static" ? dans ce cas est ce que la déclarer en 'static' est redondant ?

 

merci par avance

Message cité 1 fois
Message édité par in_your_phion le 22-12-2010 à 16:00:05
mood
Publicité
Posté le 22-12-2010 à 15:59:42  profilanswer
 

n°2043763
Un Program​meur
Posté le 22-12-2010 à 16:23:22  profilanswer
 

Donne un exemple complet, parce que je ne constate pas ce dont tu te plains.


---------------
The truth is rarely pure and never simple (Oscar Wilde)
n°2043769
gilou
Modérateur
Modzilla
Posté le 22-12-2010 à 16:39:41  profilanswer
 

Citation :

a = toto(); //ici, la fonction n'est même pas appelée, au débugger on ne rentre pas dedans.


Tu utilises a ensuite? Parce que sinon, ça peut juste être du à une optimisation de ton compilateur qui vire du code mort.
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°2043783
h3bus
Troll Inside
Posté le 22-12-2010 à 17:16:27  profilanswer
 

in_your_phion a écrit :


Code :
  1. static int a = toto(); //toto() est une fonction qui renvoie un nombre entier aléatoire, ici par exemple c'est 10




Le compilateur risque d'avoir du mal à évaluer la valeur de a avant linkage, ce qui signifie que a est bien initialisé à l'exécution.
Ce code est très dangereux car à ma connaissance tu ne sais pas dans quel ordre les variables globales vont être initialisées, et donc si toto() utilise une autre variable globale, le résultat de l'initialisation n'est pas prévisible.

 
in_your_phion a écrit :


Par ailleurs, est ce qu'une variable globale est "static" ? dans ce cas est ce que la déclarer en 'static' est redondant ?


Non, static a ici le sens "visible uniquement dans le contexte" c'est à dire le fichier c compilé après passage du préprocesseur.
Cette variable n'est donc pas partagée entre deux fichiers c

Message cité 1 fois
Message édité par h3bus le 22-12-2010 à 17:18:21

---------------
sheep++
n°2043788
Un Program​meur
Posté le 22-12-2010 à 17:21:29  profilanswer
 

h3bus a écrit :

Ce code est très dangereux car à ma connaissance tu ne sais pas dans quel ordre les variables globales vont être initialisées


 
Tres dangereux?
 
A l'interieur d'une unite de compilation, l'ordre est fixe par le langage: c'est l'ordre de definition.
 
Entre unites de compilation, l'ordre n'est pas defini par le langage.  Mais les implementations permettent souvent de le definir, au moins partiellement.


---------------
The truth is rarely pure and never simple (Oscar Wilde)
n°2043792
h3bus
Troll Inside
Posté le 22-12-2010 à 17:27:03  profilanswer
 

Un Programmeur a écrit :


Entre unites de compilation, l'ordre n'est pas defini par le langage.  Mais les implementations permettent souvent de le definir, au moins partiellement.


Justement comment tu peux le définir lors d'une initialisation, si les variables globales sont partagé entre deux .c?


---------------
sheep++
n°2043821
Un Program​meur
Posté le 22-12-2010 à 18:56:22  profilanswer
 

h3bus a écrit :


Justement comment tu peux le définir lors d'une initialisation, si les variables globales sont partagé entre deux .c?


 
Regarde dans la doc de l'implementation qui t'interesse si c'est possible (de memoire gcc le permet avec ses attributs).
 
Perso, j'ai tendance simplement a ne pas dependre de l'ordre d'initialisation entre unites de compilation.
 
Pour etre plus clair sur ma remarque: je trouve exagéré de qualifier en général l'initialisation dynamique de très dangereux simplement a cause du risque potentiel de dependance sur l'ordre d'initialisation entre unites de compilation.


---------------
The truth is rarely pure and never simple (Oscar Wilde)
n°2043889
h3bus
Troll Inside
Posté le 22-12-2010 à 21:32:56  profilanswer
 

Bon je suis d'accord c'est exagéré, je dirais simplement que je le déconseille.
 
Mais ce n'est que mon avis.


---------------
sheep++
n°2044782
in_your_ph​ion
Posté le 28-12-2010 à 12:45:53  profilanswer
 

Un Programmeur a écrit :

Donne un exemple complet, parce que je ne constate pas ce dont tu te plains.

 

hello, par exemple ce code :

 
Code :
  1. #include <iostream>
  2. using namespace std;
  3. int i=10;
  4. int toto() {
  5. return i++;
  6. }
  7. int main(void)
  8. {
  9. for (;;)
  10. {
  11.  static int val = toto();
  12.  cout << val << endl;
  13. }
  14. return 0;
  15. }
 

on ne passe qu'une seule fois dans la fonction toto(). Pourquoi ?


Message édité par in_your_phion le 28-12-2010 à 12:46:26
n°2044789
Tarabiscot​e
Posté le 28-12-2010 à 13:19:22  profilanswer
 

Parce que tu ne modifie pas ta variable val.
Il n'y a que son initialisation mais elle n'est faite bien sûr qu'une seule fois.

mood
Publicité
Posté le 28-12-2010 à 13:19:22  profilanswer
 

n°2044791
Un Program​meur
Posté le 28-12-2010 à 13:19:53  profilanswer
 

Parce que val est statique donc son initialisation n'est faite qu'au premier passage dans la boucle.  Ce qui fait la différence avec ton premier message, c'est que dans celui-là tu avais une initialisation et une assignation.  Si tu avais une assignation dans la boucle, elle serait faite pour chaque passage (y compris le premier, donc pour celui-là tu aurais deux appels: un pour initialisation, un pour l'assignation.)


---------------
The truth is rarely pure and never simple (Oscar Wilde)
n°2044863
in_your_ph​ion
Posté le 28-12-2010 à 19:23:55  profilanswer
 

ok ... merci pour vos réponses!
 
Donc, si je comprend bien ceci créerait un appel de la fonction toto() à chaque itération de la boucle :
 

Code :
  1. #include <iostream>
  2. using namespace std;
  3. int i=10;
  4. int toto() {
  5. return i++;
  6. }
  7. int main(void)
  8. {
  9. for (;;)
  10. {
  11.   static int val; //val vaut ... 0 ?
  12.   val = toto();
  13.   cout << val << endl;
  14.   }
  15.  
  16.   return 0;
  17.   }

n°2044869
esox_ch
Posté le 28-12-2010 à 20:03:49  profilanswer
 

Voilà exactement.  
Lors de ta déclaration, val contient une valeur non définie.


---------------
Si la vérité est découverte par quelqu'un d'autre,elle perd toujours un peu d'attrait
n°2044929
Un Program​meur
Posté le 29-12-2010 à 10:52:59  profilanswer
 

esox_ch a écrit :

Voilà exactement.  
Lors de ta déclaration, val contient une valeur non définie.


 
Les variables statiques sont initialisées à 0 si elles ne sont pas initialisées explicitement à une autre valeur.


---------------
The truth is rarely pure and never simple (Oscar Wilde)
n°2045024
esox_ch
Posté le 29-12-2010 à 20:29:15  profilanswer
 

Autant pour moi :jap:
Question subsidiaire : Il y a une raison à ça? C'est bien pratique que ce soit comme ça, mais personnellement je trouverais ça bien pratique que ce soit comme ça aussi pour les autres variables :D


---------------
Si la vérité est découverte par quelqu'un d'autre,elle perd toujours un peu d'attrait
n°2045025
Un Program​meur
Posté le 29-12-2010 à 20:47:40  profilanswer
 

Une variable statique c'est une variable globale.  Au démarrage, l'OS va l'initialiser de toute façon (pour éviter de laisser filtrer des informations sur les autres process).  A mon avis, c'est donc venu gratuitement sans rien faire de spécial avec la première implémentation et les autres même sans support de l'OS ont suivit parce que c'était utile et utilisé et ça c'est retrouvé dans la norme.


---------------
The truth is rarely pure and never simple (Oscar Wilde)
n°2045217
gilou
Modérateur
Modzilla
Posté le 30-12-2010 à 17:56:26  profilanswer
 

esox_ch a écrit :

Autant pour moi :jap:
Question subsidiaire : Il y a une raison à ça? C'est bien pratique que ce soit comme ça, mais personnellement je trouverais ça bien pratique que ce soit comme ça aussi pour les autres variables :D

J'ai eu un compilo C qui faisait ce type d'initialisation pour toute variable pas explicitement initialisée à la déclaration. C'était sur une station Dec/Ultrix. C'est trop sécurisant, ça donne de mauvaises habitudes. Je te dis pas la cata le jour ou le code a été recompilé sur station SUN/SUN OS ou il y avait pas ces initialisations par défaut :whistle:  
A+,

Message cité 1 fois
Message édité par gilou le 30-12-2010 à 17:57:39

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°2045235
sircam
I Like Trains
Posté le 30-12-2010 à 19:44:35  profilanswer
 

gilou a écrit :

J'ai eu un compilo C qui faisait ce type d'initialisation pour toute variable pas explicitement initialisée à la déclaration. C'était sur une station Dec/Ultrix. C'est trop sécurisant, ça donne de mauvaises habitudes. Je te dis pas la cata le jour ou le code a été recompilé sur station SUN/SUN OS ou il y avait pas ces initialisations par défaut :whistle:  
A+,


+1, j'ai assisté à ça lors d'un examen pratique, aux études... Un camarade de bagne avait réalisé et testé son projet sous Windows avant de recompiler sous SunOS sans retester... Kaboom pour son examen :sweat:
 
Ca t'apprend à ne jamais te fier à ce genre de comportement et à être explicite.


---------------
Now Playing: {SYNTAX ERROR AT LINE 1210}

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  question sur static

 

Sujets relatifs
[Algo C] Question sur calcul b paritéQuestion sur la généricité
[RESOLU] vtable errorQuestion sur WebLogic
Question con sur une exception dans un constructeurQuestion simple : destruction variable automatique
initialisation staticJointure SQL petite question
question sur static et multithread[JAVA] Question de débutant : notion de "static"
Plus de sujets relatifs à : question sur static


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR