Andere Operationen

Indizieren ( [] )

Beim Zugriff zum i-Feldelement ist der Ausdruckswert der Wert von Variable mit Laufnummer 1.

Beispiel:

array[i] = 3// dem i-Element des Feldes array den Wert 3 zuordnen.

 

Feldindex kann nur Ganzzahl sein. Zugelassen werden nicht mehr als vierdimensionele Felder. Indizieren jeder Messung wird von 0 bis der Messungsgroesse -1 durchgeführt.  Beim eindimensionalen Feld aus 50 Elementen wird der Zugriff zum ersten Element als array [0] aussehen, zum letzten Element - array[49].

Beim Zugriff ausserhalb des Feldes wird das Subsystem einen kritischen Fehler generieren und Durchführung des Programms wird unterbrochen.
 

Funktionsaufruf mit Argumenten  x1, x2,..., xn

Jedes Argument kann Konstante, Variable oder Ausdruck des entsprechenden Typs  darstellen. Übergabeargumente werden durch Kommas getrennt und muessen sich innerhalb runder Klammern befinden, linke Klammer muss nach den Namen der Aufrufunktion folgen.  

Ausdruckswert ist der Wert, der durch die Funktion zurückgegeben wird. Wenn der Typ des Rückgabewertes einer Funktion void ist, kann der Aufruf dieser Funktion nicht rechts in der Zuordnungsoperation gestellt werden. Bitte beachten Sie, die Reihenfolge der Ausführung der Ausdrücke x1,..., xn wird garantiert.

Beispiel:

   int length=1000000;   
   string a="a",b="b",c;
//---
   int start=GetTickCount(),stop;
   long i;
   for(i=0;i<length;i++)
     {
      c=a+b;
     }
   stop=GetTickCount();
   Print("time for 'c = a + b' = ",(stop-start)," milliseconds, i = ",i);

 
Operation Komma ( , )

Die durch Kommas getrennten Ausdrücke werden von links nach rechts berechnet. Alle Nebeneffekte des linken Ausdrucks können vor der Berechnung des rechten Ausdrucks erscheinen. Typ und Ergebniswert faellt mit dem Typ und Ergebniswert des rechten Ausdrucks zusammen. Als Beispiel kann die Liste der übertragenen Paameter gesehen werden (s. oben).

Beispiel:

for(i=0,j=99; i<100; i++,j--) Print(array[i][j]);

 
Operation Punkt ( . )

für direkten Zugriff zu oeffentlichen Gliedern der Strukturen und Klassen wird die Operation Punkt verwendet. Syntax

Name der Variable des Typs Strukturen .Name des Gliedes

Beispiel:

   struct SessionTime
     {
      string sessionName;
      int    startHour;
      int    startMinutes;
      int    endHour;
      int    endMinutes;
     } st;
   st.sessionName="Asian";
   st.startHour=0;
   st.startMinutes=0;
   st.endHour=9;
   st.endMinutes=0;

 
Operation mit Kontexterlaubnis ( :: )

Jede Funktion im mql5-Programm hat ihr eigenes Durchführungskontext.ZB. die Systemfunktion Print() wird im Globalkontext durchgeführt. Importfunktionen werden im kontext des entsprechenden Imports aufgerufen. Funktionen-Methoden der   Klassen haben Kontext der entsprechenden Klasse. Syntax der Operation der Kontextfreigabe:  

[Kontextname]::Funktionsname(Parameter)

Wenn der Kontextname fehlt, ist es explizites Zeichen vom Verwenden des globalen Kontextes. Wenn die Operation der Kontextfreigabe fehlt, wird die Funktion im naechsten Kontext gesucht. Wenn die Funktion im lokalen Kontext fehlt, wird die Suche im globalen Kontext durchgeführt.

Die Operation der Kontextfreigabe wird auch für Definieren der Funktion -Glied einer Klasse verwendet.

Typ Klassenname::Funktionsname(Parameterbeschreibung)
   {
// Funktionskoerper
   }

Verwendung von mehreren Funktionen mit dem gleichen Namen von verschiedenen Ausführungskontexte in einem Programm kann Mehrdeutigkeit führen. Die Prioritätsreihenfolge der Funktionsaufrufe ohne ausdrückliche Spezifikation von Umfang ist wie folgt:

  1. Klassenmethoden. Wenn es keine Funktion mit dem angegebenen Namen in der Klasse gibt, gehen Sie zum nächsten Level.
  2. MQL5-Funktionen. Wenn die Sprache nicht eine solche Funktion hat, gehen Sie zum nächsten Level.
  3. Benutzerdefinierte globale Funktionen. Wenn keine Funktion mit solchem Namen gefunden ist, gehen Sie zum nächsten Level.
  4. Importierte Funktionen. Wenn keine Funktion mit dem angegebenen Namen gefunden wird, gibt der Compiler einen Fehler zurück.

Um die Mehrdeutigkeit der Funktionsaufrufe zu vermeiden, geben Sie immer den Funktionsumfang mit Hilfe der Kontexterlaubnisoperationen.

 

Bespiel:

#property script_show_inputs
#import "kernel32.dll"
   int GetLastError(void);
#import
 
class CCheckContext
  {
   int         m_id;
public:
               CCheckContext() { m_id=1234; }
protected:
   int         GetLastError() { return(m_id); }
  };
class CCheckContext2 : public CCheckContext
  {
   int         m_id2;
public:
               CCheckContext2() { m_id2=5678; }
   void        Print();
protected:
   int         GetLastError() { return(m_id2); }
  };
void CCheckContext2::Print()
  {
   ::Print("Terminal GetLastError",::GetLastError());
   ::Print("kernel32 GetLastError",kernel32::GetLastError());
   ::Print("parent GetLastError",CCheckContext::GetLastError());
   ::Print("our GetLastError",GetLastError());
  }  
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//---
   CCheckContext2 test;
   test.Print();
  }
//+------------------------------------------------------------------+

 
Operation der Größenentnahme des Datentyps oder der Größe des Objektes jedes Datentyps ( sizeof )

Mittels der Operation sizeof kann die Speichergroesse bestimmt werden, die dem Identifikatoren oder dem Typ entspricht. Operation sizeof hat folgendes Format:

Beispiel:

sizeof(Ausdruck)

Als Ausdruck kann jeder Identifikator oder Typenname in Klammern verwendet werden. Merken wir an, dass der Typenname void nicht verwendet werden kann, und Identifikator kann nicht zum Bitfeld gehören oder Funktionsname sein.  

Wenn als Ausdruck der Name des statistischen Feldes angegeben wird ( d.h. die erste Dimensionierung vorgegebenwird), wird als Ergebnis die Größe des ganzen Feldes sein (d.h. Produkkt der Multiplikation der Elementenzahl mit Typenlaenge). wenn als Ausdruck der Name des dymnamischen Feldes angegeben wird (erste Dimensionalisierung nicht vorgegeben), wird als Ergebnis die Größe des Objektes des dynamischen Feldes.

Wenn sizeof zum Strukturnamen oder Klassenname gegenüber verwendet wird oder dem Identifikatoren, der den Typ des Struktur oder Klasse hat, wird a;s Ergebnis die tatsaechliche Größe der Struktur oder Klasse sein.

Beispiel:

   struct myStruct
     {
      char   h;
      int    b;
      double f;
     } str;
   Print("sizeof(str) = ",sizeof(str));
   Print("sizeof(myStruct) = ",sizeof(myStruct));   

Größenberechnung wird in der Etappe der Compilierung durchgeführt.

Sehen Sie auch

Prioritaeten und Operationsordnung