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

 
fxsaber:

2365 - код посыпал ошибками. Разбираться пока было некогда. Откатился на 2361 - норм. В mq4 - та же ситуация.

Спасибо за сообщение, проверю

 
Скачал новую версию МТ5 (build 2365), к сожалению что-то поломалось,
похоже в передаче параметров при вызове конструктора базового класса.
 
Sergey Dzyublik:
Баг МТ5 (build 2365) Ошибка компиляции при неявном вызове конструктора класса используя оператор присвоения, когда в качестве аргумента конструктора используется передача указателя по ссылке.
Если передачу указателя по ссылке заменить на передачу по значению - то все работает.

Спасибо за сообщение, исправлено

 

Баг МТ5 (build 2365) ошибка компиляции при вызове конструктора базового класса, когда шаблонный параметр  шаблонного класса используется в виде базового класса.
В МТ5 (build 2363) проблем не было.

class B;

template<typename T>
class A : public T{
public:
   A() : T(){}   // 'B' - identifier expected
};


class B{};

void OnStart(){
   A<B> a;
};
 
Ilyas:
Видно, что ArrayResize для объектов стал работать быстре.
Ещё раз, сложность одной из частей функции ArrayResize удалось свести от логарифма к нолю

Спасибо большое за ускорение работы ArrayResize для зарезервированной памяти.
MT5 (build 2365) на реальном проекте скорость работы std::vector::push_back стала в 1.5 раза быстрее по сравнению с предыдущим билдом.
А отставание от std::vector:resize сократилось с 2.2 раз к 1.45 раза.

 

билд 2366, по моему не правильно теперь работают константы

class A
{
private:
   int               f1(){Print(__FUNCTION__); return(1);}
   int               f2(){Print(__FUNCTION__); return(2);}
public:
   int               func(int v){const int a = f1(); const int b = f2(); return(a+b+v);}
};

A a1,a2;
//+------------------------------------------------------------------+
void OnStart()
{
   Print("1. ",a1.func(1));
   Print("2. ",a1.func(2));
   Print("3. ",a2.func(3));
   Print("4. ",a2.func(4));
}
//+------------------------------------------------------------------+

2020.03.21 12:55:59.904 tst (EURUSD,H1) A::f1

2020.03.21 12:55:59.904 tst (EURUSD,H1) A::f2

2020.03.21 12:55:59.904 tst (EURUSD,H1) 1. 4

2020.03.21 12:55:59.904 tst (EURUSD,H1) A::f1

2020.03.21 12:55:59.904 tst (EURUSD,H1) A::f2

2020.03.21 12:55:59.904 tst (EURUSD,H1) 2. 5

2020.03.21 12:55:59.904 tst (EURUSD,H1) A::f1

2020.03.21 12:55:59.904 tst (EURUSD,H1) A::f2

2020.03.21 12:55:59.904 tst (EURUSD,H1) 3. 6

2020.03.21 12:55:59.904 tst (EURUSD,H1) A::f1

2020.03.21 12:55:59.904 tst (EURUSD,H1) A::f2

2020.03.21 12:55:59.904 tst (EURUSD,H1) 4. 7

если заменить const  на static , то будет работать как и ожидалось - один вызов f1() и f2()  при инициализации a и b

  int               func(int v){static int a = f1(); static int b = f2(); return(a+b+v);}

2020.03.21 12:58:03.496 tst (EURUSD,H1) A::f1

2020.03.21 12:58:03.496 tst (EURUSD,H1) A::f2

2020.03.21 12:58:03.496 tst (EURUSD,H1) 1. 4

2020.03.21 12:58:03.496 tst (EURUSD,H1) 2. 5

2020.03.21 12:58:03.496 tst (EURUSD,H1) 3. 6

2020.03.21 12:58:03.496 tst (EURUSD,H1) 4. 7

 

если написать такой код, то вообще сплошной не отлавливаемый баг

class A
{
private:
   int               f1()const {static int v1=1; Print(__FUNCTION__); return(v1++);}
   int               f2()const {static int v2=1; Print(__FUNCTION__); return(v2++);}
public:
   int               func(int v){const int a = f1(); const int b = f2(); return(a+b+v);}
};
 
Igor Makanu:

билд 2366, по моему не правильно теперь работают константы

2020.03.21 12:55:59.904 tst (EURUSD,H1) A::f1

2020.03.21 12:55:59.904 tst (EURUSD,H1) A::f2

2020.03.21 12:55:59.904 tst (EURUSD,H1) 1. 4

2020.03.21 12:55:59.904 tst (EURUSD,H1) A::f1

2020.03.21 12:55:59.904 tst (EURUSD,H1) A::f2

2020.03.21 12:55:59.904 tst (EURUSD,H1) 2. 5

2020.03.21 12:55:59.904 tst (EURUSD,H1) A::f1

2020.03.21 12:55:59.904 tst (EURUSD,H1) A::f2

2020.03.21 12:55:59.904 tst (EURUSD,H1) 3. 6

2020.03.21 12:55:59.904 tst (EURUSD,H1) A::f1

2020.03.21 12:55:59.904 tst (EURUSD,H1) A::f2

2020.03.21 12:55:59.904 tst (EURUSD,H1) 4. 7

если заменить const  на static , то будет работать как и ожидалось - один вызов f1() и f2()  при инициализации a и b

2020.03.21 12:58:03.496 tst (EURUSD,H1) A::f1

2020.03.21 12:58:03.496 tst (EURUSD,H1) A::f2

2020.03.21 12:58:03.496 tst (EURUSD,H1) 1. 4

2020.03.21 12:58:03.496 tst (EURUSD,H1) 2. 5

2020.03.21 12:58:03.496 tst (EURUSD,H1) 3. 6

2020.03.21 12:58:03.496 tst (EURUSD,H1) 4. 7

Именно так всё и должно работать.

 
Igor Makanu:

если написать такой код, то вообще сплошной не отлавливаемый баг

Здесь тоже всё правильно.

 
Koldun Zloy:

Именно так всё и должно работать.

в прошлом году работало не так - специально тестировал модификаторы const

и кажется @Ilyas объяснял как происходит запуск MQL-программы, сначала инициализируются все const и static вне зависимости от того где они описаны, затем уже конструкторы классов будут вызваны

ладно, с этой инициализацией static / const - ее можно еще правильно распределить, но вот то, что модификатор const не гарантирует, что компилятор это проверит - очень неожиданно - мой второй пример

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