Variabili locali

Una variabile dichiarata all'interno di una funzione è locale. L'ambito di una variabile locale è limitato alla gamma di funzioni all'interno del quale è stata dichiarata. La variabile locale può essere inizializzata dal risultato di ogni espressione. Ogni chiamata della funzione inizializza una variabile locale. Le variabili locali vengono memorizzate in un'area di memoria, della funzione corrispondente.

Esempio:

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

La visibilità di una variabile è la parte del programma, in cui una variabile può essere riferita. Le variabili dichiarate all'interno di un blocco (sul piano interno), hanno il blocco come loro campo di applicazione. Il campo di applicazione blocco inizia con la dichiarazione della variabile e termina con la parentesi graffa finale destra.

Le variabili locali dichiarate all'inizio di una funzione hanno anche la visibilità del blocco, così come i parametri di funzioni che sono variabili locali. Ogni blocco può contenere dichiarazioni di variabili. Se i blocchi sono nidificati e l' identificatore nel blocco esterno ha lo stesso nome dell'identificatore nel blocco interno, l'identificatore del blocco esterno è nascosto, finché il funzionamento del blocco interno non è finito.

Esempio:

voidOnStart()
  {
//---
   int i=5;      // variabile locale della funzione
     {
      int i=10;  // variabile della funzione
      Print("Inside block i = ",i); // il risultato è i=10;
     }
   Print("Blocco esterno i = ",i);  // il risultato è  i=5;
  }

Ciò significa che mentre il blocco interno è in esecuzione, esso vede i valori dei propri identificatori locali e non i valori di identificatori con nomi identici nel blocco esterno.

Esempio:

voidOnStart()
  {
//---
   int i=5;      // variabile locale della funzione
   for(int i=0;i<3;i++)
      Print("Interno per i = ",i);
   Print("Esterno per il blocco i = ",i);
  }
/* Risultato dell'esecuzione
Interno per i = 0
Interno per i = 1
Interno per i = 2
Blocco esterno i = 5
*/

Le variabili locali dichiarate come static hanno la visibilità del blocco, nonostante il fatto che esse esistono sin dal momento in cui il programma inizia.

Stack #

In ogni programma MQL5, un'area di memoria speciale chiamata stack viene allocata per memorizzare le variabili locali delle funzioni che vengono create automaticamente. Uno stack viene allocato per tutte le funzioni, le dimensioni predefinite per indicatori sono pari a 1 Mb. In Expert Advisors e gli script, dimensione dello stack può essere gestito tramite il #property stacksize istruzione di compilatore (che imposta la dimensione dello stack in byte), una memoria di 8Mb viene allocata di default per la pila.

Le variabili locali Static sono memorizzate nello stesso luogo dove altre variabili static e global vengono memorizzate - in un'area di memoria speciale, che esiste separatamente dallo stack. Le variabili createDinamicamente usano anche un'area di memoria separata dallo stack.

Ad ogni chiamata di funzione, un posto sullo stack viene allocato per variabili interne non-statiche. Dopo l'uscita dalla funzione, la memoria è disponibile per l'uso.

Se dalla prima funzione viene chiamata la seconda, allora la seconda funzione occupa la grandezza richiesta dalla memoria stack rimanente per le sue variabili. Pertanto, quando si utilizzano funzioni incluse, lo stack di memoria sarà occupato sequenzialmente per ogni funzione. Questo può portare ad una carenza di memoria durante una delle chiamate di funzione, tale situazione è chiamata stack overflow.

Pertanto, per i dati locali grandi, si dovrebbe meglio usare la memoria dinamica - quando si entra in una funzione, allocare la memoria, che è richiesta per le esigenze locali, nel sistema (new, ArrayResize()), ed all'uscita della funzione, rilasciare la memoria (delete, ArrayFree()).

Vedi anche

Tipi di dati, Incapsulamento ed Estensibilità dei Tipi,Inizializzazione delle Variabili, Visibilità Campo di Applicazione e Durata delle Variabili, Creazione ed Eliminazione di Oggetti