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

 

Баг МТ5 (build 2367) Не соответствие приоритетов выполнения шаблонных функций в MQL в сравнении с шаблонными функциями в С++ (online: https://onlinegdb.com/B172m1PLL).
Похоже, что в рамках исправления бага, исправлена ошибка компиляции, однако приоритет выполнения перегруженных шаблонных функций так и не приведен к поведению в С++.

template<typename T>
struct B{
   T data;
};

template<typename T>
struct BB : public B<T>{};


template<typename T>                                             
struct A{
public:
   static void test(T& src){
      printf("1");
   }
   
   template<typename TT>
   static void test(B<TT>& src){
      printf("2");
   }
};

                                         
struct AA{
public:
   static void test(B<int>& src){
      printf("1");
   }
   
   template<typename TT>
   static void test(B<TT>& src){
      printf("2");
   }
};
      

void OnStart(){
   BB<int> bb;
   
   A<B<int>>::test(bb);         // MQL:2,  should be 1     
   AA::test(bb);                // MQL:2,  should be 1     
}
 

Столкнулся с прикольной проблемой. В макрос нельзя передать шаблонный тип с несколькими типами-параметрами, потому что препроцессор не знает, что имеет дело с шаблоном и считает параметры по запятым.

Описание проблемы и её решение для C++ нашел на SO.

#define COMMA ,
#define XYZ(type) {type ptr;}

XYZ(TemplatedType<A COMMA B>); // ошибка

Попробовал на MQL, но к сожалению не работает. Компилятор дает ошибку "undeclared identifier" для переменной описываемой переданным типом.

Пока обошелся дополнительным производным классом, но может поправить как в C++?

Oops. Нашел решение. Вот так работает:

#define COMMA() ,
Вопрос снимается.
Passing a template type into a macro
Passing a template type into a macro
  • 2017.05.30
  • bitmaskbitmask 22.3k1111 gold badges7070 silver badges133133 bronze badges
  • stackoverflow.com
I have a macro that takes a number of arguments, one of which is a type. For instance: If I try to instantiate this with a template type, say: This will not work as intended, as the pre-processor knows nothing of templates. It will...
 

Баг МТ5 (build 2367) расположение перегруженных шаблонных функций влияет на результат компиляции.
Изначальный тикет в рамках которого велись работы - https://www.mql5.com/ru/forum/1111/page2655#comment_15119627
С++ online (https://onlinegdb.com/BJzbH2DLL).


class input_iterator_tag  {};
class forward_iterator_tag       : public input_iterator_tag         {};
class bidirectional_iterator_tag : public forward_iterator_tag       {};
class random_access_iterator_tag : public bidirectional_iterator_tag {};


template<typename _Iterator, typename _Tp>
_Iterator set_value(const _Iterator &it,  _Tp &value, const  forward_iterator_tag*  tag){
   printf("2\r\n");
   return set_value(it, value, (input_iterator_tag*)NULL);                // 'set_value' - ambiguous call to overloaded function        
};

template<typename _Iterator, typename _Tp>
_Iterator set_value(const _Iterator &it,  _Tp &value, const  bidirectional_iterator_tag*  tag){
   printf("3\r\n");
   return set_value(it, value, (forward_iterator_tag*)NULL);
};

template<typename _Iterator, typename _Tp>
_Iterator set_value(const _Iterator &it,  _Tp &value, const random_access_iterator_tag* tag){
   printf("4\r\n");
   return set_value(it, value, (bidirectional_iterator_tag*)NULL);
};

template<typename _Iterator, typename _Tp>
_Iterator set_value(const _Iterator &val,  _Tp &value, const input_iterator_tag* tag){
   printf("1\r\n");
   return val;
};


template<typename _Iterator, typename _Tp>
_Iterator set_value(const _Iterator &it, _Tp &value){
   return set_value(it, value, it.tag);                        
};


template<typename T>
struct A{
   T data;
   static random_access_iterator_tag* tag;
};

template<typename T>
random_access_iterator_tag* A::tag = NULL;

class B{};


void OnStart (){ 
   A<B*> it;
   const B* const b_ptr = new B();
   set_value(it, b_ptr);                                      
   
   A<int> it_int;
   const int value_int = 5;
   set_value(it, value_int);         
}

int main(){
   OnStart();
   return 0;
};
 

Дефекты в работе кеша шаблонной функции/класса:
(исправлено MT5(build 2368)) ***  (up)   Undefined Behavior, создаешь сложный несколько раз обернутый объект с внутренним типом "С", а там оказывается совсем другой тип данных, может "B", может "int", что хочешь...
(исправлено MT5(build 2368)) *             Compile Error, баг при передаче в качестве const ref template аргумента указателя на функцию.
(исправлено MT5(build 2368)) *             Compile Error, объект B<int> можно создать после объекта класса B<void*>, но если сделать это перед, то возникает ошибка компиляции.


Дефекты в работе шаблонной функции/класса:
(исправлено MT5(build 2368)) *** (up)        Compile Error, баг внутри шаблонной функции, переданный указатель в рамках операции явного приведения типа ведет себя как класс в остальных случаях - как указатель.
(исправлено MT5(build 2368)) **  (up)        Compile Error, баг при попытке доступа к internal class для шаблонного параметра шаблонной функции.
(не исправлено MT5(build 2368)) ***          Compile Error, Основная претензия к неуместному выводу warning - "deprecated behavior, hidden method calling will be disabled in a future MQL compiler version". Текущая реализация - это стрельба с  пушки по воробьям.
(не исправлено MT5(build 2368)) **           Compile Error, баг касается возвращаемого значения шаблонной функции, когда возвращаемое значение - internal class, расположенный внутри шаблонного класса, тип параметра которого задается типом аргумента шаблонной функции.
(не исправлено MT5(build 2368)) **           Compile Error, баг связанный с пространством имен и области видимости в шаблонном конструкторе при вызове базового класса, когда используется одно и то же имя класса при наследовании и в internal class.
(не исправлено MT5(build 2368)) *            Compile Error, баг при вызове шаблонной функции с явным указанием типов аргументов, когда вызов выполняется из перегруженной нешаблонной функции.
(не исправлено MT5(build 2368))              Compile Error, баг при определении internal class - отсутствует возможность явно сослаться на глобальное пространство имен при указании базового класса.
(исправлено MT5(build 2368)) **           Compile Error, баг с генерацией кода шаблонного класса при использовании internal class.
(исправлено MT5(build 2368)) *            Compile Error, баг при генерации шаблонного метода/класса, процесс "автозамены" шаблонного параметра выходит за пределы скоупа в основной код программы.
(исправлено MT5(build 2368)) *            Compile Error, баг с отсутствием автоматической генерации кода шаблонного класса, когда шаблонный класс выступает в качестве return value для шаблонного метода.
(исправлено MT5(build 2368)) *            Compile Error, баг при передаче internal struct в шаблонную функцию, полученный тип данных невозможно использовать как базовый тип данных для другой internal struct в шаблонном классе.
(исправлено MT5(build 2368)) *            Compile Error, не выполняется проверка на наличие повторно использованных имен шаблонных типов при объявлении шаблонной функции внутри шаблонного класса, что приводит к неожидаемому поведению.
(исправлено MT5(build 2368))              Compile Error, множество дефектов связанных с return "in place created" object, когда объектом выступает шаблонный класс/структура.
(не исправлено MT5(build 2368)) *       (It's not a bug, it's a feature) в конструкторе базового класса невозможно выполнить explicit typecast по приведению указателя на объект базового класса к указателю на родительский класс.


Дефекты связанные с несоответствием приоритетов вызовов перегруженных функций в MQL в сравнении с С++:
(исправлено MT5(build 2368)) **  (up)        Compile Error, приоритет вызовов перегруженных шаблонных функций в действительности зависит от типа шаблонного параметра, который, в теории ни как не должен влиять на результат компиляции.
(исправлено MT5(build 2368)) **  (up)        Compile Error, когда первая из перегруженных шаблонных функций использует полностью специализированный шаблонный базовый класс, а вторая - неспециализированный шаблонный базовый класс.
(не исправлено MT5(build 2368)) **           Compile Error, при генерации кода шаблонной функции возникает ошибка компиляции несмотря на то, что имеется перегруженная шаблонная функция с подходящей сигнатурой для передаваемых параметров.
(не исправлено MT5(build 2368)) *            Compile Error, "ambiguous call to overloaded function" при вызове перегруженных шаблонных функций с разным количеством шаблонных параметров.
(исправлено MT5(build 2368)) ***          Compile Error, когда есть наследование классов A <= B <= C <= D и реализованы две overloading функции, например одна c параметра А*, а вторая с B*, то передача в такую функцию объекта C* или D* в MQL вызывает ошибку компиляции "ambiguous call to overloaded function".
(исправлено MT5(build 2368)) **           Runtime, Несоответствие приоритетов для вызовов перегруженных шаблонных функций.

Дефекты связанные с медленным выполнением функций, работой оптимизатора кода:
(исправлено MT5(build 2368)) **         Runtime, большой overhead при добавлении по одному элементу в массив с помощью ArrayResize, не смотря на то, что память для них была заранее зарезервирована, например для структур аж до 7-ми раз медленнее.


Предложения:
(new) ссылка - о внедрении поддержки intellisense для функциональности namespace на основе работы intellisense для статических методов в классах.
ссылка - о предоставлении возможности передавать литералы и временные переменные в виде const ref аргументов функции.
ссылка - при перемещении файлов проекта во вкладке "Project", для перемещаемых файлов, которые открыты и находятся во вкладках ME, автоматически обновлять их путь расположения.
ссылка - о необходимости введения в MQL typedef declaration функциональности.
ссылка - о предоставлении возможности принудительной генерации дефолтных конструкторов копирования и операторов присвоения.

 
Баг МТ5 (build 2368) ошибка компиляции при использовании модификатора доступа по умолчанию при наследовании в шаблонном классе, когда шаблонный параметр выступает базовым классом.
Раньше все работало, видимо что-то поломалось в рамках исправлений других дефектов.

class A{};

template<typename T>
class B : T{};            //'A' - unexpected token      

template<typename T>
class BB : private T{};

   
void OnStart(){    
   BB<A> bb;      // Ok
   B<A> b;        // Compile Error: 
}
 

Баг МТ5 (build 2368) ошибка компиляции при вызове оператора присвоения через явное указание базового класса. Проблема проявляется для шаблонного класса, у которого шаблонный параметр выступает базовым классом.
Раньше все работало, видимо что-то поломалось в рамках исправлений других дефектов.

struct A{
   uchar data;
   void operator=(int n){
      printf("1");
   }
};

template<typename T>
struct B : public T{
   void operator=(int n){
      T::operator=(n);    //'operator' - undeclared identifier  
   }
};

   
void OnStart(){    
   B<A> b;        
   b = 0;
}
 
Скажите у всех обновления МТ5 от 08.03.2020 стала прыгать история сделок?
Файлы:
 

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

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

fxsaber, 2020.03.22 10:04

mq5 - норм. mq4 - сломали. Можно взять TypeToBytes_ExampleScript.mq4 отсюда. Компилируется только в случае, если расширение поменять на mq5.

2368 - ничего не изменилось.

 

Через один MT5-терминал всегда мог зайти на счет любого брокера. Если возникала проблема с первым заходом, то просто делал средствами Терминала поиск соответствующего брокера, автоматически получая данные его торговых серверов. После чего сразу мог без проблем логиниться.


Сегодня впервые столкнулся с ситуацией (новый брокер), что ничего не помогает. Не зайти. В лог пишет.

2020.03.25 09:50:33.538  'xxx': no connection to XXX-Server


Скачиваю родной Терминал брокера - заходит на ура. А мой исследовательский Терминал - ни в какую. Впервые такое.

Подскажите, как сделать, чтобы не родной Терминал мог подключиться к торговому счету?

 
fxsaber:

Подскажите, как сделать, чтобы не родной Терминал мог подключиться к торговому счету?

в мт4 нужно было файл серверов server.ini скопировать в другой терминал, чтоб торговые серверы не искать

в мт5 не знаю