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

 

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


Дефекты в работе шаблонной функции/класса:
(не исправлено MT5(build 2345)) **           Compile Error, баг внутри шаблонной функции, переданный указатель в рамках операции явного приведения типа ведет себя как класс в остальных случаях - как указатель.
(не исправлено MT5(build 2345)) **           Compile Error, баг с генерацией кода шаблонного класса при использовании internal class.
(не исправлено MT5(build 2345)) **           Compile Error, баг при попытке доступа к internal class для шаблонного параметра шаблонной функции.
(не исправлено MT5(build 2345)) *            Compile Error, баг при генерации шаблонного метода/класса, процесс "автозаменны" шаблонного параметра выходит за пределы скоупа в основной код программы.
(не исправлено MT5(build 2345)) *            Compile Error, баг с отсутствием автоматической генерации кода шаблонного класса, когда шаблонный класс выступает в качестве return value для шаблонного метода.
(не исправлено MT5(build 2345)) *            Compile Error, баг при определении internal class - отсутствует возможность явно сослаться на глобальное пространство имен при указании базового класса.
(не исправлено MT5(build 2345)) *(new)   Compile Error, баг при передаче internal struct в шаблонную функцию, полученный тип данных невозможно использовать как базовый тип данных для другой internal struct в шаблонном классе.
(не исправлено MT5(build 2345)) *(new)   Compile Error, баг при вызове шаблонной функции с явным указанием типов аргументов, когда вызов выполняется из перегруженной нешаблонной функции.


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



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

 

Sergey Dzyublik:
Спасибо за вариант решения

по ссылке передается временная копия, так поменять структуру не получится

 
Andrei Trukhanovich:
по ссылке передается временная копия, так поменять структуру не получится

В общем случаи вы правы...
Но в частном - там все на много сложнее, и в действительности приведенные структуры - это указатели итераторы и изменяется не их содержимое, а объекты, на которые они ссылаются.
Так что в частном случаи проблема решена, за что и выражена благодарность.

 
Баг МТ5 (build 2345) множество дефектов связанных с return "in place created" object, когда объектом выступает шаблонный класс/структура:

class A{
public:
   A(int, int, int){};  
   A(const A&){}
   A(const A*){}
};

// simple class type
A* test_a_ptr_ptr(){
   return &A(1,2,3);               //OK
};

A test_a_class_class(){
   return A(1,2,3);                //OK
};

A test_a_ptr_class(){
   return &A(1,2,3);               //OK
};


template<typename T>
class B{
public:
   B(int &){}
   B(long){}
   B(int, int, int){};  
   B(const B&){}
   B(const A*){}
};

// template class type
B<A*> test_b_class_class(){
   B<A*> b(1);
   int x = 22;
   
   return B<A*>();              // Compile Error: ambiguous call to overloaded function with the same parameters: "B(long)" and "B(const A*)"
   return B<A*>(1,2,3);         // Compile Error: only one argument is acceptable, argument should be castable to int
   return B<A*>(x);             // Compile Error: argument is passed by value instead of by reference.
   return B<A*>((A*)NULL);      // Compile Error: 'int' - invalid cast operation        
   return B<B<B<long>>>(1);     // Compile Error: OK, template parameter type does not provide any effort on compilation result
   
   return b;
};

B<A*>* test_b_ptr_ptr(){
   B<A*> b(1);
   
   return &B<A*>(1);            // Compile Error: '&' - illegal operation use
   return &b;                 
};


void OnStart (){ 
   // simple class type
   A* a_ptr = test_a_ptr_ptr();
   A a0 = test_a_class_class();
   A a1 = test_a_ptr_class();
   
   // template class type
   B<A*> b0 = test_b_class_class();
   B<A*>* b_ptr = test_b_ptr_ptr();
}
 

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

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

Sergey Dzyublik, 2020.03.01 12:53

class A{
public:
   A(int, int, int){};  
   A(const A&){}
   A(const A*){}
};

// simple class type
A* test_a_ptr_ptr(){
   return &A(1,2,3);               //OK
};

Правильно ли понимаю, что эта функция будет возвращать указатель на несуществующий объект?

 
fxsaber:

Правильно ли понимаю, что эта функция будет возвращать указатель на несуществующий объект?

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

 

У меня тяжелый случай - логика, доступная мне, отсутствует.

Есть функция с такими входными

int Tree_Calcf(int &arr_List_Buy[],int &arr_List_Sell[],int Vektor_ZZ,int Variant_Tree_Buy=0,int Variant_Tree_Sell=0)
{
int CalcBuy=1;
int CalcSell=1;
//Print("Rez_Tree_Calc=",Rez," - f"," Vektor_ZZ=",Vektor_ZZ," CalcSell=",CalcSell);

if (Vektor_ZZ==1)
{
if(Variant_Tree_Buy==1)
{
                        if(arr_List_Buy[272]< 0.5 && arr_List_Buy[100]< 0.5 && arr_List_Buy[249]< 0.5 && arr_List_Buy[147]< 0.5 && arr_List_Buy[350]< 0.5 && arr_List_Buy[383]< 0.5 && arr_List_Buy[463]< 0.5 && arr_List_Buy[250]< 0.5 && arr_List_Buy[283]< 0.5 && arr_List_Buy[204]< 0.5 && arr_List_Buy[499]< 0.5 && arr_List_Buy[296]< 0.5 && arr_List_Buy[486]< 0.5 && arr_List_Buy[209]< 0.5 && arr_List_Buy[453]< 0.5 && arr_List_Buy[333]< 0.5 && arr_List_Buy[137]< 0.5 && arr_List_Buy[127]< 0.5 && arr_List_Buy[191]< 0.5 && arr_List_Buy[395]< 0.5 && arr_List_Buy[224]< 0.5 && arr_List_Buy[432]< 0.5 && arr_List_Buy[378]< 0.5 && arr_List_Buy[25]< 0.5 && arr_List_Buy[441]< 0.5 && arr_List_Buy[2]< 0.5 && arr_List_Buy[465]< 0.5 && arr_List_Buy[231]< 0.5 && arr_List_Buy[482]< 0.5 && arr_List_Buy[324]< 0.5) CalcBuy=0; //(0.83965634 0.16034366)
//--Вырезана часть аналогичного кода - листья дерева
}

//V03
if(Variant_Tree_Buy==2)
{
//---Вырезан код, он не активируется в момент ошибки}
//--Дерево на базе активации листьев без фильтров
if(Variant_Tree_Buy==3)
{
//---Вырезан код, он не активируется в момент ошибки}
}
//----TreeList_Sell
if(Vektor_ZZ==-1)
{
if(Variant_Tree_Sell==1)
{

                        if(arr_List_Sell[127]< 0.5 && arr_List_Sell[275]< 0.5 && arr_List_Sell[42]< 0.5 && arr_List_Sell[389]< 0.5 && arr_List_Sell[121]< 0.5 && arr_List_Sell[410]< 0.5 && arr_List_Sell[39]< 0.5 && arr_List_Sell[348]< 0.5 && arr_List_Sell[358]< 0.5 && arr_List_Sell[143]< 0.5 && arr_List_Sell[396]< 0.5 && arr_List_Sell[364]< 0.5 && arr_List_Sell[354]< 0.5 && arr_List_Sell[160]< 0.5 && arr_List_Sell[324]< 0.5 && arr_List_Sell[46]< 0.5 && arr_List_Sell[38]< 0.5 && arr_List_Sell[397]< 0.5 && arr_List_Sell[295]< 0.5 && arr_List_Sell[48]< 0.5 && arr_List_Sell[322]< 0.5 && arr_List_Sell[363]< 0.5 && arr_List_Sell[40]< 0.5 && arr_List_Sell[420]< 0.5 && arr_List_Sell[43]< 0.5 && arr_List_Sell[230]< 0.5 && arr_List_Sell[10]< 0.5 && arr_List_Sell[471]< 0.5 && arr_List_Sell[507]< 0.5 && arr_List_Sell[259]< 0.5) CalcSell=0; //(0.78952321 0.21047679)





//--Вырезана часть аналогичного кода - листья дерева
} if(Variant_Tree_Sell==2) { //---Вырезан код, он не активируется в момент ошибки } //--Дерево на базе активации листьев без фильтров if(Variant_Tree_Sell==3) { //---Вырезан код, он не активируется в момент ошибки } } int Rez=0; if(Vektor_ZZ==1)Rez=CalcBuy; if(Vektor_ZZ==-1)Rez=CalcSell; Print("Rez_Tree_Calc=",Rez," - f"," Vektor_ZZ=",Vektor_ZZ," CalcSell=",CalcSell); return Rez; }

Так вот, эта Функция иногда выдает значение 769

2020.03.01 15:54:23.500 Core 1  2019.11.13 22:57:00   Rez_Tree_Calc=769 - f Vektor_ZZ=-1 CalcSell=769

если раскомментировать первый принт

//Print("Rez_Tree_Calc=",Rez," - f"," Vektor_ZZ=",Vektor_ZZ," CalcSell=",CalcSell);

то выдается правильное значение.

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

Явно ошибка компилятора - разработчики, кому послать полную функцию, а то на форуме она не умещается.

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

class A{};

template<typename T>
class B{
public:
   B(int &){}
   B(long){}
   B(int, int, int){};  
   B(const B&){}
   B(const A*){}
};

// template class type
B<A*> test_b_class_class(){
   B<A*> b(1);
   int x = 22;
   
   return (B<A*>(1));             // Fixed Compile Error: ambiguous call to overloaded function with the same parameters: "B(long)" and "B(const A*)"
   return (B<A*>(1,2,3));         // Fixed Compile Error: only one argument is acceptable, argument should be castable to int
   return (B<A*>(x));             // Fixed Compile Error: argument is passed by value instead of by reference.
   return (B<A*>((A*)NULL));      // Fixed Compile Error: 'int' - invalid cast operation        
   return (B<B<B<long>>>(1));     // Fixed Compile Error: OK, template parameter type does not provide any effort on compilation result
   
   return b;
};

B<A*>* test_b_ptr_ptr(){
   B<A*> b(1);
   
   return &(B<A*>(1));            // Fixed Compile Error: '&' - illegal operation use
   return &b;                 
};


void OnStart (){    
   // template class type
   B<A*> b0 = test_b_class_class();
   B<A*>* b_ptr = test_b_ptr_ptr();
}
 
Sergey Dzyublik:
Оказывается, добавление круглых скобок осуществляет чудотворящее действие по решению вышеописанных проблем:

Только так и пишу.