Autres opérations

Indexation ( [] )

Lors de l'adressage du i-ème élément du tableau, la valeur de l'expression est la valeur d'une variable avec le numéro de série i.

Exemple :

array[i] = 3// Assigne la valeur 3 au i-ème élément du tableau.

Seul un entier peut servir d'indice dans un tableau. Les tableaux jusqu'à 4 dimensions sont autorisés. Chaque dimension est indexée de 0 à taille de la dimension-1. En particulier, pour un tableau à 1 dimension constitué de 50 éléments, la référence au premier élément sera array[0], celui du dernier élément sera array[49].

Lors d'un adressage au délà du tableau, le sous-système d'exécution générera une erreur critique et le programme sera stoppé.

Appel d'une Fonction avec les Arguments x1, x2 ,..., xn

Chaque argument peut représenter une constante, une variable ou une expression du type correspondant. Les arguments passés sont séparés par des virgules et doivent être entre parenthèses, la parenthèse ouvrante doit suivre le nom de la fonction appelée.

La valeur de l'expression est la valeur retournée par l'expression. Si la valeur de retour est de type void, ce type d'appel de fonction ne peut pas être placé à la droite de l'opération d'affectation. Notez que les expressions x1,..., xn sont exécutées exactement dans cet ordre.

Exemple :

   int length=1000000;   
   string a="a",b="b",c;
//--- Autres Opérations
   int start=GetTickCount(),stop;
   long i;
   for(i=0;i<length;i++)
     {
      c=a+b;
     }
   stop=GetTickCount();
   Print("heure pour 'c = a + b' = ",(stop-start)," millisecondes, i = ",i);

Opérateur Virgule ( , )

Les expressions séparées par des virgules sont exécutéers de gauche à droite. Tous les effets de bord du calcul de l'expression de gauche peuvent apparaître avant que l'expression de droite ne soit calculée. Le type du résultat et sa valeur coïncide avec ceux de l'expression de droite. La liste des paramètres à passer (voir ci-dessus) peut être considérée comme un exemple.

Exemple :

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

Operateur ( . ) #

Pour accéder directement aux membres publics des structures et des classes, l'opération point (.) est utilisée. Syntaxe :

Nom_variable_de_type_structure.Nom_membre

Exemple :

   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;

Opérateur de Résolution de Portée ( :: ) #

Chaque fonction dans un programme mql5 a sa propre portée d'exécution. Par exemple, la fonction système Print() est effectuée dans une portée globale. Les fonctions importées sont appelées dans la portée de l'import correspondant. Les fonctions des classes ont la portée de la classe correspondante. La syntaxe de l'opération de résolution de la portée est comme suit :

[Nom_portée]::Nom_fonction(paramètres)

S'il n'y a pas de nom de portée, c'est une indication explicite d'utiliser la portée globale. S'il n'y a pas d'opération de résolution de portée, la fonction est associée à la portée la plus proche. S'il n'y a pas de fonction dans la portée locale, la recherche est conduite dans la portée globale.

L'opération de résolution de portée est également utilisée pour définir les fonctions membres de classe.

type Nom_classe::Nom_fonction(description_parametres)
   {
// corps de la fonction
   }

L'utilisation de plusieurs fonctions du même nom dans différents contextes d'exécution dans un programme peuvent causer des ambiguïtés. L'ordre de priorité des appels de fonctions sans spécification de portée explicite est le suivant :

  1. Méthodes de classe. Si aucune fonction avec le nom spécifié n'existe dans la classe, va au niveau suivant.
  2. Fonctions MQL5. Si le langage n'a pas la fonction demandée, va au niveau suivant.
  3. Fonctions globales utilisateur Si aucune fonction avec le nom spécifié n'est trouvée, va au niveau suivant.
  4. Fonctions importées. Si aucune fonction avec le nom spécifié n'est trouvée, le compilateur retourne une erreur.

Pour éviter l'ambiguïté des appels de fonction, spécifiez toujours explicitement la portée de la fonction en utilisant l'opération de résolution de portée.

 

Exemple :

#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("notre GetLastError",GetLastError());
  }  
//+------------------------------------------------------------------+
//| Fonction de lancement du programme                               |
//+------------------------------------------------------------------+
void OnStart()
  {
//---
   CCheckContext2 test;
   test.Print();
  }
//+------------------------------------------------------------------+

Opération d'Obtgention de la Taille du Type de Données ou la Taille d'un Objet de n'Importe Quel Type de Données ( sizeof ) #

En utilisant l'opération sizeof, la taille de la mémoire correspondant à un identifiant ou à un type peut être défini. L'opération sizeof est au format suivant :

Exemple :

sizeof(expression)

N'importe quel identifiant, ou nom de type entre parenthèses, peut être utilisé comme une expression. Notez que le nom du type void ne peut pas être utilisé, et l'identifiant ne peut pas appartenir au champ de bits ou être un nom de fonction.

Si l'expression est le nom d'un tableau statique (c'est à dire que la première dimension est donnée), alors le résultat est la taille du tableau entier (c'est à dire le prodit du nombre d'éléments et de la longueur du type). Si l'expression est le nom d'un tableau dynamique (la première dimension n'est pas spécifiée), la résultat sera la taille de l'objet du tableau dynamique.

Lorsque sizeof est appliqué au nom d'une structure ou d'une classe, ou à l'identifiant de la structure ou de la classe, le résultat est la taille réelle de la structure ou de la classe.

Exemple :

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

La taille est calculée au moment de la compilation.

Voir aussi

Règles de Précédence