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

 
fxsaber #:
Интересный результат.

Странно, что его до сих пор не исправили:

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Ошибки, баги, вопросы

A100, 2020.08.01 05:42

Ошибка при выполнении:
template<typename T>
void f( T ) { Print( __FUNCTION__); }
void OnStart()
{
        {
                f<ulong>( 1 );
        }
}

Результат:   OnStart::unnamed#000002166562DC80::f<ulong>

Ожидалось: OnStart::f<ulong>


 
fxsaber #:
Ограничение компилятора.

Это явная недоработка - думаю на таком коде компилятор должен уже медицинскую бригаду вызывать

Круглые скобки гипотетически еще можно себе представить во вложенных макросах в таком количестве, но не фигурные
 
Просьба сообщить, правильное ли это поведение или нет, когда последовательность инциализации полей объекта структуры/класса зависят от взаимного расположения полей, а не от записей после конструктора?
struct A
{
  int Count;
  
  A() : Count(0) {}
};

struct B : public A
{
  int i, j; // Единственная строка, отличающая от C.

  B() : i(this.Count++), j(this.Count++) {}
};

struct C : public A
{
  int j, i; // Единственная строка, отличающая от B.

  C() : i(this.Count++), j(this.Count++) {}
};

void OnStart()
{
  B b;  
  Print(b.i); // 0
  Print(b.j); // 1

  C c;
  Print(c.i); // 1
  Print(c.j); // 0
}

Ожидалось, что будет инициализация слева-направо, как указано в конструкторе.

C() : i(this.Count++), j(this.Count++) {}

А получилось, что инициализация идет сверху-вниз по полям. И указанная последовательность инициализации после конструктора неважна. Это правильно?

 
fxsaber #:
Просьба сообщить, правильное ли это поведение или нет, когда последовательность инциализации полей объекта структуры/класса зависят от взаимного расположения полей, а не от записей после конструктора?

Ожидалось, что будет инициализация слева-направо, как указано в конструкторе.

А получилось, что инициализация идет сверху-вниз по полям. И указанная последовательность инициализации после конструктора неважна. Это правильно?

Зачем Разработчики пишут такую подробную справку, если ее все равно никто не читает!? Предлагаю справку упростить до одного предложения: Спроси на форуме - там помогут!

 
A100 #:

Зачем Разработчики пишут такую подробную справку, если ее все равно никто не читает!? Предлагаю справку упростить до одного предложения: Спроси на форуме - там помогут!

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

 
fxsaber #:

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


В "Типы данных" -> "Структуры и классы"

В списке инициализации члены могут идти в любом порядке, но при этом все члены класса будут инициализироваться согласно порядку их объявления.
 
Sergey Gridnev #:

В "Типы данных" -> "Структуры и классы"

В списке инициализации члены могут идти в любом порядке, но при этом все члены класса будут инициализироваться согласно порядку их объявления.

Спасибо. К сожалению, не всегда понятно, где и как искать.

 
fxsaber #:

Спасибо. К сожалению, не всегда понятно, где и как искать.

Да. Есть такое.
 

Обнаружил очень неприятную вещь в работе индикатора (MT5 и MT4).
События блокируют работу таймера.
В эксперте такого нет. 
Еще раз убеждаюсь в том, что нет смысла использовать индикаторы, где нужна стабильная работа таймера. Особенно это касается отзывчивых интерфейсов. 

Вот демонстрирующий эту проблему индикатор, в котором таймер установлен на 20 миллисекунд, и выводится время между событиями таймера, если оно превышает 100 миллисекунд

#property indicator_chart_window
//+------------------------------------------------------------------+
int OnInit()
  {
   EventSetMillisecondTimer(20);
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const int begin,
                const double &price[])
  {
   return(rates_total);
  }
//+------------------------------------------------------------------+
void  OnTimer()
  {
   static uint last_time = GetTickCount();
   uint cur_time = GetTickCount();
   if (cur_time-last_time>100) Print(string(cur_time-last_time)+" ms");
   last_time = cur_time;
  }
//+------------------------------------------------------------------+