Особенности языка mql5, тонкости и приёмы работы - страница 320

 
amrali #:

Компилятор не может определить (будущее) значение времени выполнения для расширения макроса mcr(num) во время компиляции.

В макросе mcr(z) используется оператор concat (##), поэтому он должен быть разрешен (расширен) только во время компиляции.

Понятно.

По-другому можно решить эту задачу? Возможно как-нибудь задавать имена переменных через условия?

 
Условие должно быть разрешено во время компиляции. Это можно сделать с помощью #ifdef и #ifndef.
 
amrali #:
Условие должно быть разрешено во время компиляции. Это можно сделать с помощью #ifdef и #ifndef.

Такой код тоже не компилируется.

char x3 = 0, x4 = 0, x5 = 0, o = 5;
#define num o
#define mcr(z) x##z = 5;
mcr(num)
Print("x3 = ",x3,", x4 = ",x4,", x5 = ",x5);

o уже равно 5 и переменная x5 определена. Где ошибка?

 
Andrei Iakovlev #:

Такой код также не будет компилироваться.

o уже равно 5 и переменная x5 определена. Где же ошибка?

Препроцессор ничего не знает о значении 'o' или любой другой переменной.

Чего вы на самом деле пытаетесь добиться?

 
Andrei Iakovlev #:

Такой код тоже не компилируется.

o уже равно 5 и переменная x5 определена. Где ошибка?

Если хотите получить "вычисляемые" имена переменных, используйте массивы.
 
Alain Verleyen #:

Препроцессор ничего не знает о значении 'o' или любой другой переменной.

Чего вы на самом деле пытаетесь добиться?


Полагаю, он ищет возможность прекомпилятора constexpr в C/C++.

Препроцессор MQL не поддерживает функцию const expr.

 
Таким образом, вы можете использовать условия компиляции:
#define  mcr2(z) x##z = 5
#define  mcr(z) mcr2(z)

// откомментируйте следующую строку и перепроверьте
//#define MYCOND

#ifdef  MYCOND
  #define  num 3
#endif

#ifndef  MYCOND
  #define  num 5
#endif

void OnStart()
{
   char x3 = 0, x4 = 0, x5 = 0;   
   mcr(num);
   Print("x3 = ",x3,", x4 = ",x4,", x5 = ",x5);
}
 
amrali #:
Таким образом, вы можете использовать условия компиляции

Работает как надо. Спасибо.

 
Почему второй вариант работает в 20 раз медленнее?
#import "msvcrt.dll"
  ulong memcpy( const int &dst, const ulong src, const int cnt );
  ulong memcpy( const int &dst[], const int &src[], const int cnt );  
#import

void OnStart()
{
  int Array[];
  ArrayResize(Array, 1e8);

  ArrayInitialize(Array, 1);
  
  const ulong StartTime1 = GetMicrosecondCount();  
  const int Size1 = ArraySize(Array);
  
  int Sum1 = 0;
  
  for (int i = 0; i < Size1; i++)
    Sum1 += Array[i];
    
  Print(GetMicrosecondCount() - StartTime1); // 32029
  Print(Sum1);

  const ulong StartTime2 = GetMicrosecondCount();  
  const ulong Size2 = msvcrt::memcpy(Array, Array, 0) + Size1 * sizeof(int);

  int Sum2 = 0;
  int Value = 0;
    
  for (ulong i = msvcrt::memcpy(Array, Array, 0); i < Size2; i += sizeof(int))
  {
    msvcrt::memcpy(Value, i, sizeof(int));
    
    Sum2 += Value;
  }

  Print(GetMicrosecondCount() - StartTime2); // 686099
  Print(Sum2);      
}
 
fxsaber #:
Почему второй вариант в 20 раз медленнее?

1. вызов внешней DLL.

2. копирование из памяти.