Variables Locales

une variable déclarée dans une fonction est local. La portée d'une variable locale est limitée à la portée de la fonction dans laquelle elle est déclarée. Une variable locale peut être initialisée par le résultat de n'importe quelle expression. Chaque appel à la fonction initialise une variable locale. Les variables locales sont stockées dans la zone de mémoire correspondant à la fonction.

Exemple :

int somefunc()
  {
   int ret_code=0;
   ...
   return(ret_code);
  }

La portée d'une variable est la partie du progamme dans laquelle cette variable peut être utilisée. Les variables déclarées dans un bloc (au niveau interne) ont le bloc comme portée. La portée du block commence avec la déclaration de la variable et se termine avec la dernière parenthèse fermante du bloc.

Les variables locales déclarées au début d'une fonction ont également la portée du bloc, tout comme les paramètres de fonction qui sont des variables locales. Tout bloc peut contenir des déclarations de variables. Si les blocs sont imbriqués et que l'identifiant du bloc externe a le même nom que l'identifiant dans le bloc interne, l'identifiant du bloc externe est caché, jusqu'à la fin du bloc interne.

Exemple :

void OnStart()
  {
//---
   int i=5;      // variable locale de la fonction
     {
      int i=10;  // variable de la fonction
      Print("Dans le bloc i = ",i); // le résultat est i=10;
     }
   Print("En dehors du bloc i = ",i);  // le résultat est i=5;
  }

Cela signifie que tant que le bloc interne est en cours d'exécution, il voit les valeurs de ses propres identifiants locaux, pas les valeurs des identifiants ayant des noms identiques dans le bloc externe.

Exemple :

void OnStart()
  {
//---
   int i=5;      // variable locale de la fonction
   for(int i=0;i<3;i++)
      Print("Dans la boucle for i = ",i);
   Print("En dehors du bloc i = ",i);
  }
/*  Résultat de l'exécution
Dans la boucle for i = 0
Dans la boucle for i = 1
Dans la boucle for i = 2
En dehors du bloc i = 5
*/

Les variables locales déclarées comme static ont la portée du bloc, bien qu'elles existent depuis le lancement du programme.

Pile (stack) #

Dans chaque programme MQL5, une zone spéciale de la mémoire, appelée pile, est allouée pour stocker les variables des fonctions locales qui sont créées automatiquement. Une pile est allouée pour toutes les fonctions, sa taille est par défaut pour les indicateurs est égale à 1 Mo. Dans les Expert Advisors et les scripts, la taille de la pile peut être gérée en utilisant la directive de compilation #property stacksize (qui définit la taille de la pile en octets), une mémoire de 8 Mo est allouée par défaut pour la pile.

Les variables locales statiques sont stockées au même endroit que les autres variables statiques et globales - une zone spéciale de la mémoire qui existe séparément de la pile. Les variables créées dynamiquement utilisent égaement une zone mémoire séparée de la pile.

Pour chaque appel d'une fonction, une place est allouée sur la pile pour les variables internes non statiques. A la sortie de la fonction, la mémoire est à nouveau disponible.

Si une deuxième fonction est appelée depuis la première, alors la seconde fonction occupe la taille nécessaire dans la mémoire restante de la pile pour ses propres variables. Lors de l'utilisation de fonctions inclues, la mémoire de la pile est donc occupée de façon séquentielle pour chaque fonction. Ceci peut provoquer un manque de mémoire pendant l'un des appels de fonction, cette situation est appelée un débordement de pile (stack overflow).

Pour les grosses données locales, il est donc mieux d'utiliser de la mémoire dynamique - lors de l'entrée dans une fonction, allouez la mémoire nécesaire dans le système pour les besoins locaux (new, ArrayResize()), et à la fin de la fonction, libérez la mémoire (delete, ArrayFree()).

Voir aussi

Types de Données, Encapsulation et Extensision des Types,Initialisation des Variables, Portée de Visibilité et Cycle de Vie des Variables, Crée et Supprimer des Objets