Otras operaciones

Indexación ( [] )

A la hora de dirigirse al elemento número i del array, el valor de la expresión será el valor de la variable con el número i.

Ejemplo:

array[i] = 3// Adjudicar el valor 3 al elemento número i del array array.

 

Sólo el número entero puede ser un índice del array. Se admiten sólo los arrays cuatro-dimensionales. La indexación de cada medición se realiza desde 0 hasta el tamaño de medición-1. En un caso particular de un array unidimensional compuesto por 50 elementos, la referencia hacia el primer elemento se verá como el array[0], hacia el último elemento - array[49].

Al acceder fuera de los límites del array, el subsistema ejecutivo generará un error crítico y la ejecución del programa se detendrá.
 

Llamada a función con los argumentos x1, x2,..., xn

Cada argumento puede representar una constante, variable o expresión del tipo correspondiente. Los argumentos traspasados se separan con comas y deben encerrarse entre los paréntesis, el paréntesis que abre debe seguir detrás del nombre de la función que se llama.

El valor de la función es el valor que se devuelve a la función. Si el tipo del valor devuelto a la función es void, no se puede colocar la llamada a esta función en la parte derecha dentro de la operación de asignación. Preste atención a que el orden de ejecución de las expresiones x1,..., xn se garantiza.

Ejemplo:

   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);

 
Operación coma ( , )

Las expresiones separadas con coma se calculan de izquierda a derecha. Todos los efectos secundarios derivados del cálculo de la expresión izquierda pueden surgir antes de calcular la expresión de la derecha. El tipo y el valor del resultado coinciden con el tipo y el valor de la expresión derecha. Como ejemplo podemos estudiar la lista de los parámetros traspasados (véase más arriba).

Ejemplo:

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

 
Operación punto ( . )

Para el acceso directo a los elementos públicos de las estructuras y clases se utiliza la operación punto. Sintaxis

Nombre_de_la_variable_tipo_estructura.Nombre_del_elemento

Ejemplo:

   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;

 
Operación de resolución de contexto ( :: )

En el programa mql5 cada función tiene su contexto de ejecución. Por ejemplo, la función del sistema Print() se ejecuta en el contexto global. Las funciones importadas se llaman en el contexto de importación correspondiente. Las funciones-métodos de las clases tienen el contexto de la clase correspondiente. La sintaxis de la operación de resolución de contexto:

[Nombre_del_contexto]::Nombre_de_función(parámetros)

Si falta el nombre del contexto, es una indicación directa a la utilización del contexto global. En caso de ausencia de la operación de resolución de contexto la función se busca en el contexto más próximo. Si en el contexto local no hay ninguna función, la busqueda se realiza en el contexto global.

Además, la operación de resolución de contexto se usa para definir la función-miembro de la clase.

tipo Nombre_de_clase::Nombre_de_función(descripción_de_parámetros)
   {
// cuerpo de la función
   }

Use of several functions of the same name from different execution contexts in a program may cause ambiguity. The priority order of function calls without explicit scope specification is the following:

  1. Class methods. If no function with the specified name is set in the class, move to the next level.
  2. MQL5 functions. If the language does not have such a function, move to the next level.
  3. User defined global functions. If no function with the specified name is found, move to the next level.
  4. Imported functions. If no function with the specified name is found, the compiler returns an error.

To avoid the ambiguity of function calls, always explicitly specify the function scope using the scope resolution operation.

 

Ejemplo:

#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();
  }
//+------------------------------------------------------------------+

 
Operación de obtención del tamaño de tipos de datos o el tamaño de objeto de cualquier tipo de datos (sizeof)

Utilizando la operación sizeof se puede determinar el tamaño de la memoria que corresponde al identificador o al tipo. La operación sizeof tiene el formato siguiente:

Ejemplo:

sizeof(expresión)

Cualquier identificador o el nombre del tipo encerrado entre paréntesis puede ser utilizado como una expresión. Cabe mencionar que no se puede usar el nombre del tipo void, y el identificador no puede pertenecer al campo de bits, o ser el nombre de la función.

Si la expresión es el nombre del array estático (es decir, se da la primera dimensión), entonces el resultado es el tamaño de todo el array (es decir, producto de multiplicación del número de elementos por longitud del tipo). Si la expresión es el nombre del array dinámico (no se da la primera dimensión), entonces el resultado es el tamaño del objeto del array dinámico.

Cuando sizeof se aplica al nombre del tipo de la estructura o clase, o al identificador que posee el tipo de estructura o clase, el resultado es el tamaño real de la estructura o clase.

Ejemplo:

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

El cálculo del tamaño se realiza durante la fase de compilación.

Véase también

Prioridades y orden de las operaciones