Altre Operazioni

Indicizzazione ( [] )

Quando si indirizza l' i-esimo elemento dell'array, il valore dell' espressione è il valore di una variabile con il numero di serie i.

Esempio:

array[i] = 3// Assegna il valore di 3 all' i-esimo elemento dell'array.

Solo un numero intero può essere indice di un array. Array a quattro dimensioni ed inferiori, sono ammessi. Ogni misura è indicizzata da 0 a misurazione della grandezza-1. Nel caso particolare, per un array unidimensionale costituito da 50 elementi, il riferimento al primo elemento sarà simile ad array [0], e l'ultimo elemento sarà array [49].

Quando si indirizza oltre l'array, il sottosistema di esecuzione genererà un errore critico, ed il programma viene interrotto.

Chiamare Funzione con x1, x2,..., xn Argomenti

Ogni argomento può rappresentare una costante, una variabile o un'espressione del tipo corrispondente. Gli argomenti passati vengono separati da virgole e devono essere all'interno di parentesi, la parentesi di apertura deve seguire il nome della funzione chiamata.

Il valore dell' espressione è il valore restituito dalla funzione. Se il valore restituito è di tipo void, tale chiamata di funzione non può essere posizionata a destra nell' operazione di assegnazione. Si noti che le espressioni x1,...,xn vengono eseguite esattamente in questo ordine.

Esempio:

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

Operazione virgola (,)

Espressioni separate da virgole vengono eseguite da sinistra a destra. Tutti gli effetti del calcolo dell' espressione di sinistra possono apparire prima che l'espressione di destra sia calcolata. Il tipo di risultato e valore coincidono con quelli dell'espressione di destra. L'elenco dei parametri da passare (vedi sopra) può essere considerato come un esempio.

Esempio:

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

Operatore punto (. ) #

Per l' accesso diretto ai membri pubblici delle strutture e classi viene utilizzato l'operatore punto. Sintassi:

Nome_della_variabile_del_tipo_struttura.Nome_del_membroe

Esempio:

   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;

Operazione Risoluzione Ambito ( :: ) #

Ogni funzione in un programma MQL5 ha il proprio ambito di esecuzione. Per esempio, la funzione di sistema Print() viene eseguita in un ambito globale. Funzioni Importate vengono chiamate nell'ambito dell'importazione corrispondente. Metodi di funzioni classi hanno l'ambito delle classi corrispondenti. La sintassi dell'operazione di risoluzione dell'ambito è la seguente:

[Scope_name]::Function_name(parameters)

Se non c'è un nome ambito, questa è direzione esplicita di utilizzare l'ambito globale. Se non viene eseguita alcuna operazione di risoluzione dell'ambito, la funzione è ricercata nel più vicino ambito. Se non esiste una funzione in ambito locale, la ricerca viene eseguita in ambito globale.

L'operazione di risoluzione dell'ambito viene utilizzata anche per definire la funzionemembro della classe.

type Class_name::Function_name(parameters_description)
   {
// corpo della funzione
   }

L'uso di diverse funzioni con lo stesso nome di diversi contesti di esecuzione in un programma può causare ambiguità. L'ordine di priorità delle chiamate di funzione senza esplica specificazione dello scopo è la seguente:

  1. I metodi della classe. Se nessuna funzione con il nome specificato viene impostata nella classe, passare al livello successivo.
  2. Funzioni MQL5. Se il linguaggio non dispone di una tale funzione, passare al livello successivo.
  3. Funzioni globali definite dall'utente. Se non viene trovata alcuna funzione con il nome specificato, passare al livello successivo.
  4. Funzioni importate. Se non viene trovata alcuna funzione con il nome specificato, il compilatore restituisce un errore.

Per evitare l'ambiguità di chiamate di funzione, sempre specificare esplicitamente l'ambito funzione utilizzando l'operazione di risoluzione della visibilità/scopo(scope).

 

Esempio:

#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());
  }  
//+--------------------------------------------------------------------------------+
//| Funzione di avvio del programma Script                                         |
//+--------------------------------------------------------------------------------+
voidOnStart()
  {
//---
   CCheckContext2 test;
   test.Print();
  }

Operazione di Ottenimento della Grandezza del Tipo di Dato o Grandezza di qualsiasi Tipo di Dato di Oggetto ( sizeof ) #

Utilizzando l'operazione sizeof, può essere definita la grandezza di memoria corrispondente ad un identificatore di tipo. L'operazione sizeof è del seguente formato:

Esempio:

sizeof(espressione)

Qualsiasi identificatore, o nome del tipo racchiuso tra parentesi può essere utilizzato come espressione. Si noti che il nome di tipo void non può essere utilizzato, e l'identificatore non può appartenere al campo dei bit, o essere un nome di funzione.

Se l'espressione è il nome di un array statico (cioè è data la prima dimensione), allora il risultato è la grandezza dell'intero array (cioè il prodotto del numero di elementi e la lunghezza del tipo). Se l'espressione è il nome di un array dinamico (la prima dimensione non è specificata), il risultato sarà la grandezza dell'oggetto dell' array dinamico.

Quando sizeof viene applicato al nome del tipo struttura o classe, o all'identificatore del tipo struttura o classe, il risultato è la grandezza effettiva della struttura o classe.

Esempio:

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

La grandezza viene calcolata in fase di compilazione.

Vedi anche

Regole di Precedenza