错误、漏洞、问题 - 页 1953

 
Alexey Navoykov:

所以我遗憾地承认,MQL编译器并不像我想象的那么聪明)。我甚至可以说它一点都不聪明。 ) 我试着做了一些简单的例子,结果发现,即使我创建了一个假的对象,它不在任何地方使用,也不做任何事情,编译器也不关心它。它根本就没有优化。我是单从速度上判断的。而且由于某些原因,它在新的构建中比在旧的构建中工作得更慢。

开发商意识到 了这一点。但是,编译器的这种优化远远不是要解决的优先任务。

编译器也有这种 模糊不清的地方。

 
fxsaber:

开发商意识到 了这一点。但是,编译器的这种优化远远不是要解决的优先任务。

是的,但这实在令人吃惊:他们先前在这里夸下海口,说他们把优化器的质量提高到了前所未有的高度,但实际上它连这么简单的事情都处理不了。更不用说那些更复杂的了。

 
fxsaber:

这就是为什么我建议在OnTesterInit中增加改变默认通过表的功能。

int PassesSet( const int Index, const MqlParam& Parameters[] );

我假设参数集本身并不存储在系统中,而是通过组合的唯一编号(现在它与通行证编号重合)来计算。因此,只可能改变组合的顺序,而不可能改变它们的组成。因此,在这种情况下,它将是类似于SwapPasses(long index1, long index2)的东西。

但我可能是错的。

 
Alexey Navoykov:

我假设参数集本身并不存储在系统中,而是使用唯一的组合号(现在它与通行证号重合)进行计算。因此,你只能改变组合的顺序,但不能改变它们的组成。即在这种情况下,它应该是像SwapPasses(long index1, long index2)这样的。

情况可能是这样的。现在,顺序仍然可以在某种程度上受到EA源中交换输入行的影响。

 
fxsaber:

情况可能是这样的。现在,顺序可以通过EA源代码中的交换输入行来进行某种程度的影响。

它杀死了优化算法--就像在随机方向上进行优化。

 
Stanislav Korotky:

这就扼杀了优化算法--就像在一个随机的方向上进行优化。

我们首先讨论的是完全超标的问题。

 

我正在慢慢学习OOP,遇到了一件不明显的事情。

有一个类A,它的字段是另一个类B的对象。

在类A中,有一个常量方法 被调用,它返回一个类B的对象。

之后,调用B类的一个方法,该方法删除了返回对象的参数。

它看起来像这样(这个例子是简化的,在浏览器中写的)。

class B
{
private:
   int m_width;
   int m_length;
public:
   void Reset() { m_width = 0; m_length = 0; }
}
class A
{
private:
   B m_member;
public:
   B GetBMember() const { return( m_member ); }
}
//---
A obj;
obj.GetBMember().Reset();

结果是Reset()不起作用,即m_member字段没有被清除。

问题:编译器不应该在构建时报告(错误/警告),一个常量对象的非常量方法正在被调用(或类似的情况)?

 
Alexey Kozitsyn:

问题:编译器不应该在构建时报告(错误/警告)一个非常量方法正在为一个常量对象调用(或类似的东西)?


也许原因是由于Reset 被调用为一个临时对象而隐含的复制构造器调用。

 
Sergey Dzyublik:

也许原因是由于Reset 被调用为一个临时对象而隐含的复制构造器调用。

谢谢你。你可能是对的,const指定符并不影响结果(有它和没有它都不会发生重置)。
 
Alexey Kozitsyn:

我正在慢慢学习OOP,遇到了一件不明显的事情。

有一个类A,它的字段是另一个类B的对象。

在类A中,有一个常量方法 被调用,它返回一个类B的对象。

之后,调用B类的一个方法,该方法删除了返回对象的参数。

它看起来像这样(这个例子是简化的,在浏览器中写的)。

结果是Reset()不起作用,即m_member字段没有被清除。

问题:编译器不应该在构建时报告(错误/警告),一个常量对象的非常量方法正在被调用(或类似的情况)?

返回指针。
class B
{
private:
   int m_width;
   int m_length;
public:
   void Reset() { m_width = 0; m_length = 0; }
}
class A
{
private:
   B m_member;
public:
   B * GetBMember() const { return( & m_member ); }
}
//---
A obj;
obj.GetBMember().Reset();