エラー、バグ、質問 - ページ 2966

 

というのも、そこではエラーは明らかではない。"そういう意図だったのかもしれない "と。

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

terminal:
2021.02.19 19:30:47.003 Terminal Opening Broker x64 build 2755 started for JSC ''Opening Broker''
2021.02.19 19:30:47.113 Terminal Windows 7 Service Pack 1 build 7601, Intel Core i5-2520M @ 2.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.1.0.0.1.0.0.1.0.0.50GHz、メモリ 5 / 7Gb、ディスク 41 / 287Gb、IE 11、UAC、GMT+3

スクリプトを繰り返し実行すると、変数 a,b,x の初期値が変わることがありますが、全体の動作は一定です。

1.スクリプトの最初の部分では、コード中の変数a、bの値は変化しませんが、いきなりPrintFormat("%I64d", 1)を実行すると1が出力され、bも同じです。そして、最も興味深いのは、(a==1)==true で、すぐに (a==2)==true (bも同様) になることです!!!最後の呼び出しでは、PrintFormat("a==%I64d, b==%I64d", a, b) は a==1 を示しますが、b == はスクリプトの最初にあった値です。

2.スクリプトの後半では、uninitial変数の値を変更しようとします。y=x++の後、xの値は変化するはずです。しかし、それは変わらない(この実行では==1)。

どなたか、このスクリプトを実行して、その出力を投稿してください。

それゆえ、目利きの方に質問ですが、これは正常な動作(未定義の動作のようなもの)なのでしょうか? それともバグなのでしょうか?

 
mktr8591:

再び、未初期化の変数について。その価値はいかようにも予測できるものであることは明らかです。しかし、関数の実行時に勝手に値が変わるというのは、今回初めて遭遇しました(検索しても出てきません)。以下は、スクリプトのコードとその結果です。

の結果です。


terminal:
2021.02.19 19:30:47.003 Terminal Opening Broker x64 build 2755 started for JSC ''Opening Broker''
2021.02.19 19:30:47.113 Terminal Windows 7 Service Pack 1 build 7601, Intel Core i5-2520M @ 2.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.1.0.0.1.0.0.1.0.0.50GHz、メモリ 5 / 7Gb、ディスク 41 / 287Gb、IE 11、UAC、GMT+3

スクリプトを繰り返し実行すると、変数 a,b,x の初期値が変わることがありますが、全体の動作は一定です。

1.スクリプトの最初の部分では、コード中の変数a、bの値は変化しませんが、いきなりPrintFormat("%I64d", 1)を実行すると1が出力され、bも同じです。そして、最も興味深いのは、(a==1)==true で、すぐに (a==2)==true (bも同様) になることです!!!最後の呼び出しでは、PrintFormat("a==%I64d, b==%I64d", a, b) は a==1 を示しますが、b == はスクリプトの最初にあった値です。

2.スクリプトの後半では、uninitial変数の値を変更しようとします。y=x++の後、xの値は変化するはずです。しかし、それは変わらない(この実行では==1)。

どなたか、このスクリプトを実行して、その出力を投稿してください。

それゆえ、目利きの方に質問ですが、これは正常な動作(未定義の動作のようなもの)なのでしょうか? それともバグなのでしょうか?

変数を初期化しないのは異常な動作です。初期化すれば、そのような質問はありません。