Variables locales

Una variable declarada dentro de una función función es local. La zona de visibilidad de la variable local está limitado por los márgenes de la función dentro de la cual ésta esta declarada. La variable local puede ser inicializada con la ayuda de cualquier expresión. La inicialización de la variable local se realiza cada vez durante la llamada a la función correspondiente. Las variables locales se ubican en zona temporal de la memoria de las función correspondiente.

Ejemplo:

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

La zona de aplicación(o visibilidad) de una variable es una parte del programa en la cual se puede referirse a la variable. Las variables declaradas dentro del bloque (a nivel local) van a tener el bloque como su zona de aplicación. La zona de aplicación del bloque se empieza con la declaración de la variable y se termina con la llave derecha final.

Las variables locales declaradas al principio de la función también tienen la zona de aplicación del bloque igual que los parámetros de la función, que también son variables locales. Cualquier bloque puede contener las declaraciones de las variables. Si los bloques están anidados y el nombre de Identificador del bloque exterior coincide con el del bloque interior, el identificador del bloque exterior está "invisible" (oculto) hasta que se termine el trabajo en el bloque interior.

Ejemplo:

void OnStart()
  {
//---
   int i=5;      // variable local de la función
     {
      int i=10;  // variable de la función 
      Print("En el bloque i = ",i);   // resultado  i = 10;
     }
   Print("Fuera del bloque i = ",i);  // resultado  i = 5;
  }

Eso significa que mientras se ejecuta el bloque interno, él ve los valores de sus propios identificadores locales, y no los valores de los identificadores con los mismos nombres en el bloque exterior.

Ejemplo:

void OnStart()
  {
//---
   int i=5;      // variable local de la función
   for(int i=0;i<3;i++)
      Print("Dentro for i =",i);
   Print("Fuera del bloque i =",i);
  }
/* Resultado de ejecución
Dentro for i = 0
Dentro for i = 1
Dentro for i = 2
Fuera del bloque i = 5
*/

Las variables locales declaradas como static, tienen la visibilidad del bloque, a pesar de que existan desde el principio de ejecución del programa.

Pila #

En cada programa MQL5 para guardar las funciones variables locales que se crean automáticamente se asigna una zona de memoria especial que se llama la pila. Una pila se asigna para todas las funciones, y por defecto su tamaño es de 1Mb. En los expertos y scripts, es posible cambiar el tamaño de la pila con la ayuda de la directiva del compilador #property stacksize (establece el tamaño de la pila en bytes), por defecto, a estos se les asigna un tamaño de 8 Mb.

Las variables locales estáticas se ubican en el mismo lugar que las demás variables estáticas y globales, en una zona especial de la memoria que existe separadamente de la pila. Las variables creadas dinámicamente también utilizan una zona de memoria distinta de la pila.

Con cada llamada a la función, para las variables internas no estáticas se les asigna una zona en la pila. Después de salir de la función, la memoria se queda disponible para su volver a usarse.

Si desde la primera función se hace la llamada a la segunda, ésta en su lugar ocupa en la pila un volumen necesario para sus variables en la memoria restante de la pila. De esta manera, cuando se utilizan las funciones incluidas, la memoria de la pila será ocupada consecutivamente por cada función. Esto puede provocar la falta de memoria durante la siguiente llamada a la función. Esta situación se llama sobrellenado de memoria.

Por eso es mejor utilizar la memoria dinámica para los grandes datos locales - cuando se entra en la función, asignar la memoria necesaria para uso local en el sistema (new, ArrayResize()), y cuando se sale de la función, liberar la memoria (delete, ArrayFree()).

Véase también

Tipos de datos, Encapsulación y extensión de tipos, Inicialización de variables, Visibilidad y tiempo de vida de variables, Creación y eliminación de objetos