错误、漏洞、问题 - 页 2966

 
fxsaber:

讨论了。

那里的错误并不明显,因为。"也许它本来就是这样的"。

这里是执行函数GetLastError() = ERR_WRONG_STRING_DATE之后的情况。如果日期是错的,为什么结果没有错?

 
fxsaber:

我怀疑这一点。

我没有打扰...我数了数--你有30行,我有13行

 
A100:

我没有打扰...我数了数--你有30行,我有13行。

最主要的是获得相同的结果,而不是失去性能。

 

在二进制搜索排序数组中的一个值时出错。

void OnStart()
  {
   long hash[]= {-8017261424500504960,-7417030212113027668,-4495301772150012897,8444435679621798267};
   long my_hash=hash[3];
   int index=ArrayBsearch(hash,my_hash);
   ArrayPrint(hash);
   Print(my_hash,": ",index);
  }

结果。

2021.02.19 15:46:22.937 test3 (EURUSD,M1)       -8017261424500504960 -7417030212113027668 -4495301772150012897  8444435679621798267
2021.02.19 15:46:22.937 test3 (EURUSD,M1)       8444435679621798267: 2

不应该是2,而应该是3

 
Aliaksandr Hryshyn:

在二进制搜索排序数组中的一个值时出错。

结果。

不应该是2,而应该是3

//+------------------------------------------------------------------+
//| если добавить еще одно положительное число, то ошибки нет. где-то|
//|косяк в алгоритме бинарного поиска при переходе с минуса на плюс. |
//+------------------------------------------------------------------+
void OnStart()
  {
   long hash[]= {-8017261424500504960,-7417030212113027668,-4495301772150012897,8444435679621798267,8444435679621798268};
   ArrayPrint(hash);
   for(int i=0; i<ArraySize(hash); i++)
     {
      long my_hash=hash[i];
      int index=ArrayBsearch(hash,my_hash);
      Print(my_hash,": ",index);
     }
  }
//+------------------------------------------------------------------+
//| >>>| -8017261424500504960 -7417030212113027668                   |
//|-4495301772150012897 8444435679621798267  8444435679621798268     |
//|   -8017261424500504960: 0                                        |
//|   -7417030212113027668: 1                                        |
//|   -4495301772150012897: 2                                        |
//|   8444435679621798267: 3                                         |
//|   8444435679621798268: 4                                         |
//+------------------------------------------------------------------+
 
DMITRII PECHERITSA:

这不是一个绕过错误的问题,而是一个修复错误的问题,特别是由于这个函数可以在许多来源中使用,甚至是标准来源。而且有可能是在终端代码本身、代码编辑器中使用...

 
Aliaksandr Hryshyn:

这不是一个绕过错误的问题,而是一个修复错误的问题,特别是由于这个函数可以在许多来源中使用,甚至是标准来源。而且有可能是在终端代码本身、代码编辑器中使用...

我认为问题出在几乎所有比特都繁忙的情况下的大比特上。经过这么长时间,竟然有人发现这个错误。


 
DMITRII PECHERITSA:

他们可能会解决这个问题。在我看来,问题出在几乎所有位子都很忙的情况下的大长线上。令人惊讶的是,有人在这么长时间后发现了这个错误。


我很惊讶他们在这么长的时间里没有在一个经常使用的功能中发现这个错误。

 

再次,关于未初始化的变量。很明显,他们的价值可以在任何方面都是不可预测的。但这是我第一次遇到它们可以在函数运行时自行改变其值(我没有通过搜索发现)。下面是脚本代码和我得到的东西。

//--- проверка поведения неинициализированных переменных
void OnStart()
  {
   Print("проверка поведения неинициализированных переменных");
   long a, b;


//тест без изменения значений переменных
   PrintFormat("a==%I64d, b==%I64d", a, b);
   Print("a==1:", a == 1);
   Print("a==2:", a == 2);
   Print("b==1:", b == 1);
   Print("b==2:", b == 2);

   PrintFormat("%I64d", 1);  //после этого начинаются чудеса

   PrintFormat("a==%I64d", a);
   PrintFormat("b==%I64d", b);
   Print("a==1:", a == 1);
   Print("a==2:", a == 2);
   Print("b==1:", b == 1);
   Print("b==2:", b == 2);
   PrintFormat("a==%I64d, b==%I64d", a, b);
   Print("a==1:", a == 1);
   Print("a==2:", a == 2);
   Print("b==1:", b == 1);
   Print("b==2:", b == 2);

//тест с изменением значения переменных
   int x, y = 0;
   Print("x=", x, " y=", y);
   Print("y = x++");
   y = x++;
   Print("x=", x, " y=", y);
  }

结果。

2021.02.19 20:23:07.446 TestBug (Eu-3.21,H1)    проверка поведения неинициализированных переменных
2021.02.19 20:23:07.446 TestBug (Eu-3.21,H1)    a==0, b==-10289152
2021.02.19 20:23:07.446 TestBug (Eu-3.21,H1)    a==1:false
2021.02.19 20:23:07.446 TestBug (Eu-3.21,H1)    a==2:false
2021.02.19 20:23:07.446 TestBug (Eu-3.21,H1)    b==1:false
2021.02.19 20:23:07.446 TestBug (Eu-3.21,H1)    b==2:false
2021.02.19 20:23:07.446 TestBug (Eu-3.21,H1)    1
2021.02.19 20:23:07.446 TestBug (Eu-3.21,H1)    a==1
2021.02.19 20:23:07.446 TestBug (Eu-3.21,H1)    b==1
2021.02.19 20:23:07.446 TestBug (Eu-3.21,H1)    a==1:true
2021.02.19 20:23:07.446 TestBug (Eu-3.21,H1)    a==2:true
2021.02.19 20:23:07.446 TestBug (Eu-3.21,H1)    b==1:true
2021.02.19 20:23:07.446 TestBug (Eu-3.21,H1)    b==2:true
2021.02.19 20:23:07.446 TestBug (Eu-3.21,H1)    a==1, b==-10289152
2021.02.19 20:23:07.446 TestBug (Eu-3.21,H1)    a==1:true
2021.02.19 20:23:07.446 TestBug (Eu-3.21,H1)    a==2:true
2021.02.19 20:23:07.446 TestBug (Eu-3.21,H1)    b==1:true
2021.02.19 20:23:07.446 TestBug (Eu-3.21,H1)    b==2:true
2021.02.19 20:23:07.446 TestBug (Eu-3.21,H1)    x=1 y=0
2021.02.19 20:23:07.446 TestBug (Eu-3.21,H1)    y = x++
2021.02.19 20:23:07.446 TestBug (Eu-3.21,H1)    x=1 y=0

终端:
2021.02.19 19:30:47.003 终端Opening Broker x64 build 2755开始为JSC''Opening Broker''
2021.02.19 19:30:47.113 终端Windows 7 Service Pack 1 build 7601, Intel Core i5-2520M @ 2.50GHz, 5 / 7 Gb内存, 41 / 287 Gb磁盘, IE 11, UAC, GMT+3

如果脚本重复运行,变量a,b和x的初始值可能会改变,但整体行为是不变的。

1.在脚本的第一部分,代码中的变量a和b的值没有变化,但在运行PrintFormat("%I64d", 1)后突然PrintFormat("a==%I64d", a)输出1,b也一样。最有趣的是(a==1)==真,并立即(a==2)==真(对b也是)!!!在最后一次调用PrintFormat("a==%I64d, b==%I64d", a, b)显示a==1,但b==脚本开始时的值。

2.在脚本的第二部分,我试图改变非初始变量的值。在y=x++之后,x的值应该改变。但它仍然保持不变(在这次运行中==1)。

请谁试着运行一下这个脚本,并把输出结果贴出来。

因此,请问行家们--这是正常的行为(如未定义的行为)吗? 或者是一个错误?

 
mktr8591:

再次,关于未初始化的变量。很明显,他们的价值可以在任何方面都是不可预测的。但这是我第一次遇到它们可以在函数运行时自行改变其值(我没有通过搜索发现)。下面是脚本代码和我得到的东西。

结果。


终端:
2021.02.19 19:30:47.003 终端Opening Broker x64 build 2755开始为JSC''Opening Broker''
2021.02.19 19:30:47.113 终端Windows 7 Service Pack 1 build 7601, Intel Core i5-2520M @ 2.50GHz, 5 / 7 Gb内存, 41 / 287 Gb磁盘, IE 11, UAC, GMT+3

如果脚本重复运行,变量a,b和x的初始值可能会改变,但整体行为是不变的。

1.在脚本的第一部分,代码中变量a和b的值没有变化,但在运行PrintFormat("%I64d", 1)后突然PrintFormat("a==%I64d", a)输出1,b也一样。最有趣的是(a==1)==真,并立即(a==2)==真(对b也是)!!!在最后一次调用PrintFormat("a==%I64d, b==%I64d", a, b)显示a==1,但b==脚本开始时的值。

2.在脚本的第二部分,我试图改变非初始变量的值。在y=x++之后,x的值应该改变。但它仍然保持不变(在这次运行中==1)。

请谁试着运行一下这个脚本,并把输出结果贴出来。

因此,请问行家们--这是正常的行为(如未定义的行为)吗? 或者是一个错误?

不初始化你的变量是不正常的行为。初始化,就不会有这样的问题。