Ошибки, баги, вопросы - страница 2473

 
Sergey Dzyublik:


На текущий момент не возможно использовать статическую переменную, объявленную внутри шаблонного класса.
С внедрением пространства имен, данное ограничение можна будет обойти?

Да, можно.

Код будет немного другим, более правильным, вот пример:

//+------------------------------------------------------------------+
//|                                                  ScopeSample.mq5 |
//|                        Copyright 2019, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2019, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
template<typename T>
class A
  {
public:
   struct Item
     {
      T                 value;
      
      Item(T initial=10):value(initial) { Print(__FUNCSIG__); }
     };

   static Item       s_default;
  };
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
template<typename T>
class B
  {
public:
   struct Item
     {
      T                 value;
      
      Item(T initial=100):value(initial) { Print(__FUNCSIG__); }
     };

   static Item       s_default;
  };
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
template<typename T>
A::Item A::s_default;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
template<typename T>
B::Item B::s_default;
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   Print(A<int>::s_default.value);
   Print(B<int>::s_default.value);
  }
//+------------------------------------------------------------------+


Результат:

2019.05.24 17:16:20.225 ScopeSample (EURUSD,H1) A<int>::Item::Item(int)
2019.05.24 17:16:20.225 ScopeSample (EURUSD,H1) B<int>::Item::Item(int)
2019.05.24 17:16:20.225 ScopeSample (EURUSD,H1) 10
2019.05.24 17:16:20.225 ScopeSample (EURUSD,H1) 100
 
Очень круто, спасибо большое.
Есть ли возможность получить альфа доступ к МТ с поддержкой namespace?
Действительно надо в рамках изучения возможность написания "умного контейнера", не для поиска багов/уязвимостей и т.д.
 

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

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

Sergey Dzyublik, 2019.05.23 13:52

За последнее время предоставлено информацию о десятке "особенностей" работы и багов в МТ.
Как узнать стоит ждать их исправление или нет?
Прошу не предлагать тестить все каждый раз при выходе нового билда.

 (не исправлено в MT5(build 2059)) "Ошибка компиляции при передаче в шаблонную функцию параметра (void*)(NULL)"".
 (исправлено в MT5(build 2059)) "Тестер стратегий: запланировано 2 прохода, но на практике бесконечное число проходов > 900шт из-за ошибки "OnInit critical error"".
 (не исправлено в MT5(build 2059))  "Некорректное значение поля размер массива в рамках работы дефолтного оператора присваивания для структур с динамическими массивами".
 (не исправлено в MT5(build 2059))  "Компилятор не видит дефолтный конструктор копирования класса при возвращении объекта класса по значению из функции".
  и  (исправлено в MT5(build 2059))  "Ошибка компиляции при выполнении type cast "самого в себя" для шаблонных классов и "сложных" структур".
 (не исправлено в MT5(build 2059))  "При работе с typedef использование шаблонной функции с явной специализацией не вызывает генерацию кода этой шаблонной функции".
 (не исправлено в MT5(build 2059)) "Ошибка компиляции при повторном использовании одной и той же сигнатуры функции в рамках typedef".
 (не исправлено в MT5(build 2059))  "Значительная часть функций для работы со строками не работает с NULL символами в строке (например: ShortArrayToString, StringInit, StringFill)".
 (не исправлено в MT5(build 2059))  "Функция StringSetLength работает только в сторону "обрезания" длины строки, но не увеличения".
 (исправлено в MT5(build 2057)) "Тестер стратегий: запуск 750 процессов "metatester64.exe"".
 "Форум www.mql5.com, при правке сообщения с картинкой, предыдущая картинка не заменяется на новую".


Предложения:
 "Предоставить пользователю возможность принудительной генерации/удаления кода для оператора присвоения (конструктор копирования) по умолчанию".
 "Разрешить функции ArrayCopy копировать классы и "сложные" структуры, аналогично тому как структуры предоставляют функционал deep copy для любого типа объекта".
 "Предоставить пользователю функционал для чтения/установки значения Capacity при работе с динамическими массивами"

 "Изменения по улучшению инфографики сервиса "Сигналы""


 

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

Данные в стакане меняются.

Сейчас 24.05.2019 23:40

В терминале последний тик за 23.05.2019.


Такая же ситуация по некоторым другим инструментам, включая те, по которым я сам производил сделки.

На втором терминале (отдельная установка), на другом счете того же брокера эффект тот же.

 
Подскажите, есть ли возможность определить, работает эксперт в режиме оптимизации или одиночного тестирования?
 
MT5 (build 2059)
Ошибка компиляции при передаче в шаблонную функцию параметра  (void*)(NULL):
class C{
public:
   template<typename T>
   static void func(T ){
      Print(__FUNCSIG__);
   }
};


void OnStart(){  
   void* c_ptr = new C();
   
   C::func((C*)NULL);     // Ok
   C::func(c_ptr);        // Ok
   C::func((void*)NULL);  // 'void' - illegal use of 'void' type
   
   delete c_ptr;
}
Все работало в (build 2057), возможно что-то поламалось в рамках исправления:
  и   "Ошибка компиляции при выполнении type cast "самого в себя" для шаблонных классов и "сложных" структур".
 
Возможно по аналогии с С++ имеет смысл ввести "полноценный" нулевой указатель - nullptr ?
 

Еще в build 2056 все работало нормально. А в 2059 - уже ошибка при компиляции:

void OnStart()
{
class A {};
//#define void  A //(*)
        const void *p1;
              void *p2 = (void *)p1; //Error: 'void' - class type expected
}

А если void заменить на A (*), то все нормально. А какая разница?

Более того - ошибка при компиляции возникает даже в этом случае:

              void *p2 = (void *)p1; //Error: 'void' - class type expected
 

При компиляции в командном build 2059x32 абстрактная ошибка:

но через IDE не воспроизводится - может и случайность

 
A100:

Как делаете выбор между использованием шаблонов и void* ?

Причина обращения: