Portée de Visibilité et Cycle de Vie des Variables

Il existe deux types de portée : portée locale et portée globale.

Une variable déclarée en dehors de toutes les fonctions est située dans la portée globale. L'accès à ces variables peut être fait de n'importe où dans le programme. Ces variables sont situées dans la zone globale de la mémoire, leur cycle de vie coincide donc avec le cycle de vie du programme.

Une variable déclarée dans un bloc (partie du code entourée d'accolades) appartient à la portée locale. Une telle variable n'est pas visible (et donc non disponible) en dehors du bloc dans lequel elle est déclarée. La cas le plus courant de déclaration locale est une variable déclarée dans une fonction. Une variable déclarée localement est située sur la pile, et son cycle de vie est égal au cycle de vie de la fonction.

Puisque la portée d'une variable locale est le bloc dans lequel elle est déclarée, il est possible de déclarer des variables avec le même nom que des variables déclarées dans des blocs supérieurs ; de même que pour celles déclarées aux niveaux supérieurs, jusqu'au niveau global.

Exemple :

void CalculateLWMA(int rates_total,int prev_calculated,int begin,const double &price[])
  {
   int        i,limit;
   static int weightsum=0;
   double     sum=0;
//---
   if(prev_calculated==0)
     {
      limit=MA_Period+begin;
      //--- affecte une valeur vide aux premières barres
      for(i=0; i<limit; i++) LineBuffer[i]=0.0;
      //--- calcule la première valeur visible
      double firstValue=0;
      for(int i=begin; i<limit; i++)
        {
         int k=i-begin+1;
         weightsum+=k;
         firstValue+=k*price[i];
        }
      firstValue/=(double)weightsum;
      LineBuffer[limit-1]=firstValue;
     }
   else
     {
      limit=prev_calculated-1;
     }
 
   for(i=limit;i<rates_total;i++)
     {
      sum=0;
      for(int j=0; j<MA_Period; j++) sum+=(MA_Period-j)*price[i-j];
      LineBuffer[i]=sum/weightsum;
     }
//---
  }

Faites attention à la variable i, déclarée en ligne

      for(int i=begin; i<limit; i++)
        {
         int k=i-begin+1;
         weightsum+=k;
         firstValue+=k*price[i];
        }

Sa portée n'est que pour la boucle for ; en dehors de cette bouel, il y a une autre variable avec le même nom déclarée au début de la fonction. De plus, la variable k est déclarée dans le corps de la boucle, sa portée est le corps de la boucle.

Les variables locales peuvent être déclarées avec le spécificateur d'accès static. Dans ce cas, le compilateur a une variable dans la zone globale de mémoire. Le cycle de vie d'une variable statique est donc égal au cycle de vie du programme. Ici, la portée d'une telle variable est limitée au bloc dans lequel elle est déclarée.

Voir aussi

Types de Données, Encapsulation et Extension des Types,Initialisation des Variables, Créer et Supprimer des Objets