Lokale Variablen

Variable, die innerhalb einer Funktion erklärt wird ist lokal.  Sichtbereich der lokalen Variable ist von Funktion begrenzt, innerhalb deren sie erklärt wird. Lokale Variable kann initialisiert werden mittels jedes Ausdrucks. Initialisierung der lokalen Variable wird jedesmal beim Aufruf entsprechender Funktion durchgeführt. Lokale Variablen werden im zeitlichen Speicherbereich entsprechender Funktion aufgestellt.

Beispiel:

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

Operationsbereich (oder Sichtbereich) der Variable ist Programmteil , in dem auf die Variable verwiesen werden kann. Variable, die innerhalb des Blocks erklärt werden (auf innerem Niveau) haben Block als Operationsbereich. Operationsbereich Block faengt mit der Erklaerung der Variable und beendet mit der rechten geschweiften Klammer.

Lokale Variablen, erklärt am Funktionsanfang haben Operationsbereich Block sowi Funktionsparameter, die lokale Variablen sind. Jeder Block kann Variablenerklärungen enthalten. Wenn Blocks eingebettet sind und Identifikator im Aussenblock den selben Namen, wie Identifikator im innenblock hat, ist der Identifikator des Aussenblocks "unsichtbar" (verhuellt) bis Fertigstellung des Innenblocks.

Beispiel:

void OnStart()
  {
//---
   int i=5;      // lokale Variable der Funktion
     {
      int i=10;  // Variable der Funktion 
      Print("im Block i = ",i); // Ergebnis  i=10;
     }
   Print("ausser Block i = ",i);  // Ergebnis  i=5;
  }

Das bedeutet, dass sobald der Innenblock durchgeführt wird, sieht er die Werte seiner eigenen lokalen Identifikatoren, und nicht die Werte der Identifikatoren mit identischen Namen im umfassenden Block.

Beispiel:

void OnStart()
  {
//---
   int i=5;      // lokale Variable der Funktion
   for(int i=0;i<3;i++)
      Print("Innerhalb for i = ",i);
   Print("Ausserhalb i = ",i);
  }
/* Ergebnis der Durchführung
innerhalb for i = 0
innerhalb for i = 1
innerhalb for i = 2
ausserhalb des Blocks i = 5
*/

Lokale Variablen erklärt als static, haben Operationsbereich Block, obwohl sie seit Anfang der Programmdurchführung existieren.

Stack #

In jedem MQL5 Programm, ist ein spezieller Speicherbereich genannt zur Speicherung von automatisch erstellten lokalen variable Funktionen verteilt. Es wird ein Stack für alle Funktionen reserviert, standardmäßig beträgt seine Größe für Indikatoren 1 Mb. In Expert Advisors und Skripts kann man die Stack-Größe per Compiler-Direktive #property stacksize steuern (setzt die Stack-Größe in Bytes), standardmäßig werden für sie 8Mb reserviert.

Statische lokale Variablen werden an der gleichen Stelle, wo andere statische und globale Variablen gespeichert werden gespeichert - In einem speziellen Speicherbereich, der separat aus dem Stack besteht. Dynamisch erstellte Variablen auch verwenden ein separater Speicherbereich (getrennt von der Stack).

Mit jedem Aufruf der Funktion, wird ein Platz auf dem Stack für interne nicht-statische Variablen zugewiesen. Nach dem Verlassen der Funktion ist der Speicher wieder verfügbar.

Wenn aus der ersten Funktion dis zweite Funktion aufgerufen wird, dann nimmt die zweite Funktion die erforderliche Größe aus dem verbleibenden Stack-Speicher für ihre Variablen. Damit bei der Verwendung von enthaltenden Funktionen, wird Stack-Speicher sequentiell für jede Funktion belegt werden. Dies kann zu einem Mangel an Arbeitsspeicher während einer der Funktionsaufrufe führen, ist eine solche Situation Stack-Überlauf  genannt.

Daher ist für große lokale Daten besser den dynamischen Speicher zu verwenden - bei der Eingabe einer Funktion, den Speicher für die lokalen Bedürfnisse im System zu reservieren (new, ArrayResize()), und beim Verlassen der Funktion den Speicher freizugeben (delete, ArrayFree()).

Sehen Sie auch

Datentypen, Inkapsulation und Erweiterungsfaehigkeit der Typen, Initialisierung der Variablen, Sichtbereich und Lebensdauer der Variablen, Erzeugung und Entfernung der Objekte