Другие операции

Индексирование ( [] )

При обращении к i-му элементу массива значением выражения является значение переменной с порядковым номером i.

Пример:

array[i] = 3// Присвоить значение 3 i-му элементу массива array.

 

Индексом массива может быть только целое число. Допускаются не более чем четырехмерные массивы. Индексация каждого измерения производится от 0 до размер измерения-1. В частном случае одномерного массива из 50 элементов обращение к первому элементу будет выглядеть как array[0], к последнему элементу - array[49].

При доступе за пределы массива исполняющая подсистема сгенерирует критическую ошибку, и выполнение программы будет остановлено.
 

Вызов функции с аргументами x1, x2,..., xn

Каждый аргумент может представлять собой константу, переменную или выражение соответствующего типа. Передаваемые аргументы разделяются запятыми и должны находиться внутри круглых скобок, открывающая круглая скобка должна следовать за именем вызываемой функции.

Значением выражения является значение, возвращаемое функцией. Если тип возвращаемого значения функции есть void, то вызов такой функции нельзя помещать справа в операции присвоения. Обратите внимание, что порядок выполнения выражений x1,..., xn гарантируется.

Пример:

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

 
Операция запятая ( , )

Выражения, разделенные запятыми, вычисляются слева направо. Все побочные эффекты вычисления левого выражения могут возникать до вычисления правого выражения. Тип и значение результата совпадают с типом и значением правого выражения. В качестве примера можно рассматривать список передаваемых параметров (см.выше).

Пример:

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

 
Операция точка ( . )

Для прямого доступа к публичным членам структур и классов используется операция точка. Синтаксис

Имя_переменной_типа_структуры.Имя_члена

Пример:

   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;

 
Операция разрешения контекста ( :: )

Каждая функция в mql5-программе имеет свой контекст исполнения. Например, системная функция Print() выполняется в глобальном контексте. Импортируемые функции вызываются в контексте соответствующего импорта. Функции-методы классов имеют контекст соответствующего класса. Синтаксис операции разрешения контекста:

[Имя_контекста]::Имя_функции(параметры)

Если имя контекста отсутствует, то это явное указание на использование глобального контекста. В случае отсутствия операции разрешения контекста, функция ищется в ближайшем контексте. В случае отсутствия функции в локальном контексте, поиск производится в глобальном контексте.

Также операция разрешения контекста используется для определения функции-члена класса.

тип Имя_класса::Имя_функции(описание_параметров)
   {
// тело функции
   }

Если в программе используются или могут в будущем использоваться несколько одноименных функций из разных контекстов исполнения, то может возникнуть неоднозначность. Порядок приоритета вызова функций без явного указания контекста:

  1. Методы класса. Если функция с заданным именем в классе не задана, то ищем на следующем уровне.
  2. Функции MQL5. Если такой функции в языке нет, то ищем на следующем уровне.
  3. Глобальные функции, определенные пользователем. Если такой функции нет, то ищем на следующем уровне.
  4. Импортируемые функции. Если функция не найдена среди импортируемых, то компилятор выдает ошибку.

Для устранения неоднозначности вызова функций явно указывайте область видимости с помощью операции разрешения контекста.

 

Пример:

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

 
Операция взятия размера типа данных или размера объекта любого типа данных ( sizeof )

С помощью операции sizeof можно определить размер памяти которая соответствует идентификатору или типу. Операция sizeof имеет следующий формат:

Пример:

sizeof(выражение)

В качестве выражения может быть использован любой идентификатор, либо имя типа, заключенное в скобки. Отметим, что не может быть использовано имя типа void, а идентификатор не может относится к полю битов или быть именем функции.

Если в качестве выражения указано имя статического массива (то есть, задана первая размерность), то результатом является размер всего массива (т.е. произведение числа элементов на длину типа). Если в качестве выражения указано имя динамического массива (первая размерность не задана), то результатом будет размер объекта динамического массива.

Когда sizeof применяются к имени типа структуры или класса или к идентификатору имеющему тип структуры или класса, то результатом является фактический размер структуры или класса.

Пример:

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

Вычисления размера происходит на этапе компиляции.

Смотри также

Приоритеты и порядок операций