错误、漏洞、问题 - 页 2679

 
fxsaber:

2365 - 代码中洒满了错误。还没有时间去弄清楚。我回滚到2361年--它是好的。在mq4中--同样的情况。

谢谢你的留言,我将检查

 
下载了新版本的MT5(build 2365),不幸的是有些东西坏了。
似乎是在调用基类的构造函数时的参数传递
 
Sergey Dzyublik:
Bug MT5 (build 2365)当通过引用传递的指针 被用作构造器参数时,使用赋值运算符对类的隐式构造器 调用出现编译错误。
如果用值传递取代指针传递,一切都会正常。

谢谢你的帖子,已修复

 

MT5错误(build 2365)当模板类的模板参数被用作基类时,调用基类构造器时 出现编译错误。
在MT5(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比之前的build快1.5倍。
而std::vector:resize滞后从2.2倍下降到1.45倍。

 

build 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

如果你用static代替const,它将按预期工作--在a和b的初始化过程中调用f1()和f2()。

  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:

build 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

如果你用static代替const,它将按预期工作--在a和b的初始化过程中调用f1()和f2()。

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:

这正是它应该工作的方式。

去年不是这样的--我专门测试了常数修改器

似乎@Ilyas 解释了如何运行一个MQL程序,首先所有的常量和静态都被初始化,不管它们在哪里被描述,然后调用类的构造函数。

OK,有了这个初始化的静态/常量--它仍然可以被正确地分发,但事实上,常量修饰符并不能保证编译器会检查这一点,这是非常意外的--我的第二个例子