错误、漏洞、问题 - 页 2000

 
Alexey Viktorov:

而在OnCalculate中已经这样做了,是没有意义的。没有理由用一些东西来初始化数组,然后用公式中的一些值来填充它?当你添加一个条形图,并且分别是一个数组单元格时,用一些东西填充它,然后立即用公式中的一个值或一个空值,这有什么意义?

这是在所有条形图上应用该公式的情况下。如果它只适用于最后一个人呢?例如,我有很多指数允许我设置要计算的条数,因为计算量可能很大。需要进行初始化。

一般来说,如果你不想做,就不要做。我不再讨论这个问题了。;-)

 
fxsaber:

所以这不是ArrayResize的问题,而是ArrayInitialize的问题。ArrayResize保证了MT4中的零点。

如果你仔细阅读呢?让我再次引用它。

用表达式ArrayInitialize(array, init_val)初始化一个数组并不意味着用相同的值初始化为这个数组分配的储备元素。当 ArrayResize() 函数随后在当前保留范围内增加数组的大小时,其值未被定义且多半不等于init_val元素被添加到数组的末端

ArrayInitialize - Операции с массивами - Справочник MQL4
ArrayInitialize - Операции с массивами - Справочник MQL4
  • docs.mql4.com
ArrayInitialize - Операции с массивами - Справочник MQL4
 
Stanislav Korotky:

如果你仔细阅读呢?我再引用一遍。

用表达式ArrayInitialize(array, init_val)初始化一个数组并不意味着初始化为这个数组分配的储备元素。当 ArrayResize() 函数随后在当前保留范围内 增加数组的大小时其值未被定义 且多半不等于init_val元素被添加到数组的末端

他们只是让它安全,以便更难解释那里没有init_val。但是,当然,你可以用 "其值为空 "来代替它。
 
Stanislav Korotky:

而且为什么要编造这种不现实的情况,基本上是MQL程序员的错误?显然,完全初始化只做一次,或者在检测到数据转储的情况下。在这种情况下,由内核来完成会更有效率。

我在哪里说过双重初始化?就像上面提到的那样,在一个循环中填充所有的元素,我说的就是这个。如果它存在,初始化就没有必要,只会浪费资源。

好吧,如果你不计算所有的条数,那就自己注意填上零。

 
Stanislav Korotky:

这是在所有条形图上应用该公式的情况下。如果它只适用于最后一个人呢?例如,我有很多指数允许我设置要计算的条数,因为计算量可能很大。需要进行初始化。

一般来说,如果你不想做,就不要做。我不再讨论这个问题了。;-)

这里有金句...但最好是说 "在我们没有必要的地方,我们不会做"。或者反过来说,"我们只在有必要的情况下才会这样做"。

 
fxsaber:

只有新的数组元素 被初始化。而重点仍然是一样的--即使代码中有错误(往往不是你自己的),各次运行的结果都是一样的。我在上面举了一个数学库的例子

垃圾是邪恶的。

我甚至找不到像样的词来评论它。

如果要求你用它来涂抹自己...我不认为你会去做这件事。比方说,第一次你不知道它是什么,那么第二次呢?

你为什么要求开发商保护你免受垃圾之苦?保护自己。或者,如果你有无可辩驳的论据证明它是必要的,那么就不要对公众隐瞒它们。

你知道,mql3是一个可以写出很多错误的地方,以至于让你的头发都竖起来了......而EA并不重要,反正它可以工作......它工作得对吗? 谁在乎呢?

由于某些原因,对走出阵列没有争论。而且,这似乎比数组或变量中的垃圾更少的罪恶。好吧,我们在数组中没有这样的索引,因为它曾经是,所以请便,让我们继续工作。手,让我们回去工作吧。这一切都解决了...

 
Alexey Viktorov:

那么,为什么你要求开发商保护你不受垃圾影响?保护自己。或者如果有令人信服的理由,那么就不要对公众隐瞒。

没有任何要求,无可辩驳的表现。

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

虫子,虫子,问题

fxsaber, 2017.09.12 16:17

#property strict

void OnStart()
{
  uchar Array[];
  
  const int Size = ArrayResize(Array, 10000);
  
  bool Res = false;
  
  for (int i = 0; (i < Size) && (!Res); i++)
    Res = Array[i];
    
  Print(Res);
}

在MT4中,它将总是返回false,因为没有垃圾,它都是零。在MT5中是这样的。

因此,MT4测试器中的相同代码在不同的运行中总是显示相同的结果。在MT5测试器中,它不会。

 
fxsaber:

没有要求,显示了不可反驳性

谁禁止只加一条线?

  uchar Array[];
  const int Size = ArrayResize(Array, 10000);
  bool Res = false;
  ArrayInitialize(Array, 0);
  for (int i = 0; (i < Size) && (!Res); i++)
    Res = Array[i];
  Print(Res); 

或者你不知道假的是0,其他的都是真的,不管符号是什么?在这种情况下,用0来初始化数组 是合理的,但为什么在没有必要的情况下要用强制清零来加重系统的负担呢?

对不起,但这个例子绝对是胡说八道。

 
Alexey Viktorov:

谁禁止只加一条线?

这不是关于我。

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

虫子,虫子,问题

fxsaber, 2017.09.12 16:52

想到一些数学库(Include/Math--7Mb的源代码)没有在一个/两个地方初始化,就觉得很可怕!这就是为什么我们要把它作为一个数学库。在MT5测试器中出现不同的单次运行,而在MT4中出现相同的运行,如何解决这个错误呢?

 
fxsaber:

这不是关于我。

唯一要做的事是放弃所有其他人的图书馆。而且我从来没有看过或使用过这些图书馆中的任何一个。写下你所需要的一切,比挖出一堆东西来检查虫子要容易得多......。而仅仅使用两到三个功能...