C et valeur initiale d'une variable statique

Résolu/Fermé
Sébastien - 12 févr. 2009 à 21:35
azureus33 Messages postés 49 Date d'inscription vendredi 16 janvier 2009 Statut Membre Dernière intervention 7 février 2010 - 13 févr. 2009 à 00:08
Bonsoir,
Pourquoi est-il impossible d'initialiser une variable statique avec la valeur d'une autre variable statique ?

3 réponses

Je pense qu'une variable statique est crée avant que le programme s'exécute, et donc avant toutes les variables qui ne sont pas statiques.
Par exemple j'ai déclaré deux variables globales, dont la valeur d'une est copiée dans l'autre, mais ça me renvoi une erreur puisque je lui affecte une variable :

int variable = 5;
int variable2 = variable;

int main ()
{
    return 0;
}


L'erreur est la suivante :
error C2099: l'initialiseur n'est pas une constante


Il me semble qu'une variable globale a les mêmes caractéristiques qu'une variable déclarée statique dans une fonction, non ?
1
int variable2 = variable;
Je suppose que tu voulais mettre: static int variable2 = variable;
On ne peux pas initialiser un variable statique comme une autre variable. Pourquoi?
J'ai une explication, mais je ne suis pas certain de sa véracité.
Ce qui est sûr, c'est qu'une variable statique est localisée dans le segment de données alors que les variables automatiques sont localisées dans la pile. Lorsqu'une variable automatique est construite (c'est-à-dire lorsque le programme entre dans le bloc dans laquelle elle est définie), une place est réservée pour elle dans la pile et une valeur y est éventuellement affectée; lors de la sortie du bloc, il suffit simplement de supprimer la place en modifiant la valeur de la pile. Pour une variable statique, c'est différent; il n'y a pas de construction de la variable; le bloc de données qui est sur le disque est simplement copié en mémoire dans le segment de données. Il faut donc qu'au moment de la compilation la valeur soit connue, cette valeur ne peut donc qu'être déjà constante et ne peut donc dépendre de la valeur d'une variable.
C'est comme cela que je l'interprète... mais est-ce bien la bonne?
0
azureus33 Messages postés 49 Date d'inscription vendredi 16 janvier 2009 Statut Membre Dernière intervention 7 février 2010 7
12 févr. 2009 à 23:13
la variable static n'a rien avoir avec une variable globale.

chaque variable possède une durée de vie lorsque tu rentre dans un bloc (fonction, if, while, for, {})
toutes les variable crée dans se bloc sont détruite a sa sortie avec son contenu. grace au mot cles static
la variable n'est pas détruit ainsi lorsque que l'on repasse dans le bloc ou elle se trouve comme une fonction
on récupère les données entré lors du précédent appel.

Exemple :



void fonction () {
 //pour cette variable me sert par exemple a compter le nombre de fois que j'appelle cette focntion
 static compteur=1 ;
 printf("Fonction appeler %d fois\n", compteur) ;


 int p ;
 //dans se for coucou est détruit a chaque boucle et un nouveau est créé résultat toujours égal a 1
  for (p=0 ; p<5 ; p++) {
     int coucou=0 ;
     coucou++ ;
     printf("coucou1=%d\n", coucou) ;
  }

 //dans se for coucou est sauvegardé grace au mot cles static chaque boucle on a l'ancien contenu de la boucle 
 // précédente donc coucou= {1, 2, 3, 4, 5}
  for (p=0 ; p<5 ; p++) {
     static int coucou=0 ;
     coucou++ ;
     printf("coucou2=%d\n", coucou) ;
  }

  compteur++ ;
}




Biensûr la porté de la variable static est la même qu'un variable local normal. Doonc en dehors du for je ne peut utilisé la variable coucou idem pour compteur visible uniquement dans la fonction.
( static int coucou=0 ;) le '=0' ne seras appelle qu'une fois si la variable n'existe pas alors l'initialisation a lieu.

J'espère avoir était claire pour toi.

une variable global ne peut être initialisé par une autre variable en dehors d'une fonction.
Sauf si la variable est créé par un #define qui définit une variable constante.
0
azureus33 Messages postés 49 Date d'inscription vendredi 16 janvier 2009 Statut Membre Dernière intervention 7 février 2010 7
12 févr. 2009 à 22:19
il est tout a fait possible de initialisé une variable static avec une autre.
Sais-tu plutot quel est le but du mot clès static pour une variable ? peut tu donné une définition ou exemple d'utilisation que tu ne comprend pas.
0
"une variable global ne peut être initialisé par une autre variable en dehors d'une fonction."

Comment ça se fait ?
0
Voir réponse n° 3.
Une variable globale est comme une variable statique. Sa durée de vie est celle du programme donc elle ne sera pas construite sur la pile; elle sera donc dans le segment de données et par conséquent devra être déterminée lors de la compilation.
0
azureus33 Messages postés 49 Date d'inscription vendredi 16 janvier 2009 Statut Membre Dernière intervention 7 février 2010 7
13 févr. 2009 à 00:08
En partant du principe que en global on t'autorise a déclarer des variables, des struct, des fonctions cependant tu n'a pas le droit de faire d'opération comme 'while', variable++...
Or dire int variable=varaible2 ; c'est déclarer une variable et faire une opération de copie de valeur
contrairement a int variable=3 ; qui ne copie pas de valeur mais initialise avec cette valeur.

Après le pourquoi du comment. Faut pas aller cherché midi à quatorze heure. une règle est une règle. Des personnes qualifier un jour on tranché sur des choix et on dit nous ne permettons pas de faire des operation n'importe où, car avec l'expérience qu'il ont raisons cela ne serait pas logique.
0