错误、漏洞、问题 - 页 1856

 
Andrey Dik:

我怎样才能看到编码呢?
,我知道它已经通过在第三方编辑器中改变文本的外观而改变了,但如何分辨哪个编码我不知道。
Andrey Khatimlianskii:
刚刚在ME 1580中创建了一个EA:Win-1251(ANSI)。

是的,用Akepad我看到编码是Win-1251(ANSI),但老文件有UTF-16LE 1200。

所以它确实改变了新文件的默认编码?

 

关于交易、自动交易系统和交易策略测试的论坛

mql5语言的特点、微妙之处以及技巧

fxsaber, 2017.04.14 11:40

是的,歪门邪道的经纪人。他们也会把负数放在那里。

如果开发者在经纪商设置符号时对每个参数的可能值范围有一个限制,那就更好了。

 

我注意到,当我从市场上更新产品时--图表上该产品的所有设置都被重置为默认值。

这是不对的,如何才能避免这种情况?

 

ArrayMaximum()和ArrayMinimum()--参数的传递顺序与帮助不一致。


 
fxsaber:
一个小小的诀窍。绕过赋值运算符

结果

这不是小费,是一种变态。

我没有想到你会这样做。

 
Koldun Zloy:

这不是一个聪明的把戏,而是一个变态的行为。

我没有想到你会这样做。

所以这是给你的

关于交易、自动交易系统和策略测试的论坛

图书馆:TypeToBytes

fxsaber, 2017.04.13 13:34

举个例子说明这个功能对识别潜在错误的作用。

编写和运行脚本。

#include <TypeToBytes.mqh>

struct STRUCT
{
  int i;
  
  STRUCT() : i(0) {}
  
  template <typename T>
  void operator =( T& ) {}
};

#define  PRINT(A) ::Print(#A + " = " + (string)(A));

void OnStart()
{
  PRINT(_WRONG_ASSIGN_OPERATOR(STRUCT))
}


结果。

_WRONG_ASSIGN_OPERATOR(STRUCT) = true

这表明赋值运算符不会将该结构复制到同一类型的结构中。


如果我们在结构上增加更多。

  void operator =( STRUCT &Value ) { this.i = 0; }

其结果将是一样的。


看起来,将这个操作符改为

  void operator =( STRUCT &Value ) { this.i = Value.i; }

但图书馆却说不是。


这也许是这个例子中最微妙的一点。

纠正的方法是

#include <TypeToBytes.mqh>

struct STRUCT
{
  int i;
  
  STRUCT() : i(0) {}
  
  template <typename T>
  void operator =( T& ) {}

  void operator =( const STRUCT &Value ) { this.i = Value.i; }
};

#define  PRINT(A) ::Print(#A + " = " + (string)(A));

void OnStart()
{
  PRINT(_WRONG_ASSIGN_OPERATOR(STRUCT))
}

而你得到的结果是

_WRONG_ASSIGN_OPERATOR(STRUCT) = false


现在,复制运算符是正确的!

我们可以用同样的方法检查任何简单结构 的分配/复制操作者的正确性。

 

1.当我们这样写的时候。

STRUCT StructCopy1 = Struct;
应该调用的不是operator=,而是复制构造函数。

虽然,这更像是一个关于Metaquotes的问题。

2.如果编译器创建的复制构造函数没有被调用,我们可以自己编写。

struct STRUCT
{
  int i;
  
  STRUCT(){}
  STRUCT( int _i ) : i(_i){}
  STRUCT( const STRUCT& other )
  {
      i = other.i;
  }
  
  void operator =( const STRUCT& )
  {
    this.i = 5;
  }
};

现在,operator=没有被调用。

3.由于结构成员 对我们来说是可用的,我们可以直接这样写。

StructCopy1.i = Struct.i;

但如果你把它们变成私人的,那么你的小费钩也不会有帮助。

4.最重要的是:operator=用来确保所有的赋值都经过它,而不是绕过它。

通常情况下,拷贝构造函数是和它一起定义的。

是的,我翻阅了样本。我没有看到多少利润。

 
Koldun Zloy:

1.当我们这样写的时候。

应该调用的不是operator=,而是复制构造函数。

虽然,这更像是一个关于Metaquotes的问题。

2.如果编译器创建的复制构造函数没有被调用,我们可以自己编写。

现在,operator=没有被调用。

3.由于结构成员 对我们来说是可用的,我们可以直接这样写。

但如果你把它们变成私人的,那么你的小费钩也不会有帮助。

4.最重要的是:operator=用来确保所有的赋值都经过它,而不是绕过它。

通常情况下,拷贝构造函数是和它一起定义的。

是的,我翻阅了样本。我没有看到多少利润。

Lifehack也绕过了复制构造器。而好处就在这里
#include <TypeToBytes.mqh>

struct STRUCT
{
  int i;
  
  STRUCT(){}
  STRUCT( int _i ) : i(_i){}
  STRUCT( const STRUCT& other )
  {
      i = 2;
  }
  
  void operator =( const STRUCT& )
  {
//    Print(__FUNCSIG__);
    
    this.i = 5;
  }
};

void OnStart()
{
  STRUCT Struct(1);  

  ArrayPrint(_R(Struct).Bytes); // 1 0 0 0
  
  STRUCT StructCopy1 = Struct;  // STRUCT( const STRUCT& )

  ArrayPrint(_R(StructCopy1).Bytes); // 2 0 0 0
    
  StructCopy1 = Struct;         // void STRUCT::operator=( const STRUCT& )

  ArrayPrint(_R(StructCopy1).Bytes); // 5 0 0 0
}

_R是一个普遍的东西。这就是为什么我们不需要用自己的操作者来重新定义外星结构。

#include <TypeToBytes.mqh>

struct STRUCT
{
  int i;
  
  void operator =( const STRUCT& )
  {
    this.i = 5;
  }
};

void OnStart()
{
  STRUCT Structs[] = {{1}, {2}};
  
  ArrayPrint(_R(Structs).Bytes); // 1 0 0 0 2 0 0 0
}
 
Andrey Dik:

是的,用Akepad我看到编码是Win-1251(ANSI),但旧文件有UTF-16LE 1200。

那么,新文件的默认编码毕竟有没有变化?

不,它一直是Win-1251(ANSI),UTF是在某个时候加入的。但只适用于那些含有非英语字符的源文件。
 
Andrey Khatimlianskii:
不,它一直是Win-1251(ANSI),在某些时候加入了UTF。但只适用于那些含有非英语字符的来源。
我明白了。谢谢你。
原因: