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

 
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 не гарантирует, что компилятор это проверит - очень неожиданно - мой второй пример

 
Koldun Zloy:

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

не правильно!

специально проверил в VS2019:

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

Ошибка CS0133 Назначаемое для "a" выражение должно быть константным. ConsoleApp2 ..\repos\ConsoleApp2\ConsoleApp2\Program.cs 13 Активные

Ошибка CS0133 Назначаемое для "b" выражение должно быть константным. ConsoleApp2 ..\repos\ConsoleApp2\ConsoleApp2\Program.cs 13 Активные

[Удален]  
Igor Makanu:

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

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

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

В обоих Ваших примерах всё работает правильно и ожидаемо.

 
Koldun Zloy:

В обоих Ваших примерах всё работает правильно и ожидаемо.

ожидаемо, что модификатор const это 99% уверенность, что компилятор найдет мою ошибку при компиляции, VS2019 это делает, MQL это не делает

[Удален]  
Igor Makanu:

ожидаемо, что модификатор const это 99% уверенность, что компилятор найдет мою ошибку при компиляции, VS2019 это делает, MQL это не делает

Что конкретно Вы считаете ошибкой?

У меня VS2019 не выдаёт никаких ошибок.