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

 
Yurixx:

你能告诉我吗,请告诉我。

在指标中,系列的顺序,例如close[],是由ArraySetAsSeries()设置一次还是以其他方式设置?

是在OnCalculate()中完成还是可以在OnInit()中完成?

我遇到了一个令人困惑的情况。

close[]中的订单,在第一个tick上被AS_SERIES设置,在下一个tick上自发地改变为正常的,即!AS_SERIES。

我还没有在代码中找到这个原因。

在任何获得标量&arr[]的函数中,你都不能绝对确定数组的索引 方向 :-(

此外,如果你改变了内部的 "序列性",这个方向将在你的函数结束后仍然存在......这将是一个副作用,没有人希望如此。

这就是为什么,不幸的是,当你得到一个数组输入到一个函数中时,要记住它的序列化,把它设置成一个方便的序列化,当你退出函数时,一定要把原始的序列化返回。

这是OnCalculate的罕见情况,但在实践中,它也曾经被其他代码所调用。

 
Maxim Kuznetsov:

此外,如果你在内部改变了 "序列化",当你的函数结束时,这个方向将保持不变......

这正是我所指望的。这就是为什么我把ArraySetAsSeries(close,true)放在OnCalculate() 块中,它在第一次登录时只执行一次。而这种 "序列化 "确实是设定的。然而,令我惊讶的是,在第二次打勾,甚至更多的时候,"序列性 "已经相反了。

Maxim Kuznetsov:

对于OnCalculate来说,这是一种罕见的情况,但在实践中,它恰好也被其他代码所调用。

我没有这样的异物,而且,我也没有在程序中改变时间序列和缓冲区数组的 "序列化"。因此,我只需在指标开始时设置一次即可。但是,如果我们不能确定这些数组的 "序列性 "是否被保存,我们就必须在每个OnCalculate() 循环的开始设置它。这似乎是完全不自然的事情。

 
input string inStr = NULL; // Входная строка не может быть NULL, но об этом нигде не сообщается.

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

void OnStart()
{
  string Str = NULL;
  
  PRINT(inStr == NULL); // false
  PRINT(Str == NULL);   // true


  PRINT(inStr == ""); // true
  PRINT(Str == "");   // false
}
在编译时生成一个警告是个好主意。
 
fxsaber:
在编译时生成一个警告是个好主意。

如果从以前到现在没有什么变化,那么NULL !"="" 很多人以前都上过当。

 
Alexey Viktorov:

如果从以前到现在没有什么变化,那么NULL !"="" 很多人以前都上过当。

这不是我们正在谈论的问题。

 
fxsaber:

我们谈论的是别的东西。

然后解释为什么不可能。为什么?

input string inStr = "";

可以,但

input string inStr = NULL;

不可能的。

 
Alexey Viktorov:

然后解释为什么不可能。

上面的脚本显示了这一点。

 
fxsaber:

上面的脚本显示了这一点。

如果是这样,就不会有问题了。你总是认为周围的人都应该读懂你的想法,或者在编程方面比你训练得更好。

 
Alexey Viktorov:

如果是这样,就不会有问题了。你总是认为每个人都应该读懂你的想法,或者在编程方面比你训练得更好。

我不明白这种反应的原因。简短的代码100%地演示了这个功能。

 
fxsaber:

我不明白这种反应的原因。简短的代码100%地演示了这个功能。

正常反应。我不明白你的代码,我要求解释,答案是......

NULL是这样一个模糊的概念,你必须小心地处理它。特别是在应用于字符串变量时。

从文件中可以看出

//--- если строка не инициализирована, то присвоим ей наше предопределенное значение 
if(some_string==NULL) some_string="empty";

因此,在这个例子中,NULL并不意味着字符串的长度 等于零,而是意味着该变量没有被初始化。

在你的例子中

input string inStr = NULL;

该变量被初始化。我不清楚它是如何被初始化的,我也不觉得有什么好整理的。

因此。

PRINT(inStr == NULL); // false

表示该变量已被初始化。同样,用什么来做是个大问题。为什么你认为不可能用NULL来初始化一个变量?

显然,这个初始化导致字符串长度等于零,这就是这个检查说的

PRINT(inStr == ""); // true