Erreurs, bugs, questions - page 2966

 
fxsaber:

J'en doute.

Je n'ai pas pris la peine... J'ai compté - vous avez 30 lignes, j'en ai 13.

 
A100:

Je n'ai pas pris la peine... J'ai compté - vous avez 30 lignes, j'en ai 13.

L'essentiel est d'obtenir le même résultat et de ne pas perdre en performance.

 

Erreur dans la recherche binaire d'une valeur dans un tableau trié :

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);
  }

Résultat :

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

Au lieu de 2, ce devrait être 3

 
Aliaksandr Hryshyn:

Erreur dans la recherche binaire d'une valeur dans un tableau trié :

Résultat :

Au lieu de 2, ce devrait être 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:

Il ne s'agit pas de contourner l'erreur, mais de la corriger, d'autant que cette fonction peut être utilisée dans de nombreuses sources, même standard. Et il est possible qu'il soit utilisé dans le code du terminal lui-même, l'éditeur de code...

 
Aliaksandr Hryshyn:

Il ne s'agit pas de contourner l'erreur, mais de la corriger, d'autant que cette fonction peut être utilisée dans de nombreuses sources, même standard. Et il est possible qu'il soit utilisé dans le code du terminal lui-même, l'éditeur de code...

Je pense que le problème vient des gros bits dans une situation où presque tous les bits sont occupés. Il est étonnant que quelqu'un ait trouvé cette erreur après tant de temps.


 
DMITRII PECHERITSA:

Ils vont probablement le corriger. A mon avis, le problème se situe au niveau des grandes longueurs dans une situation où presque tous les bits sont occupés. il est surprenant que quelqu'un ait trouvé ce bug après tant de temps.


Je suis surpris qu'ils n'aient pas trouvé ce bug dans une fonction fréquemment utilisée depuis si longtemps.

 

Encore une fois, à propos des variables non initialisées. Il est clair que leur valeur peut être imprévisible de quelque manière que ce soit. Mais c'est la première fois que je rencontre le fait qu'ils peuvent changer leur valeur par eux-mêmes lors de l'exécution d'une fonction (je ne l'ai pas trouvé en cherchant). Voici le code du script et ce que j'obtiens :

//--- проверка поведения неинициализированных переменных
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);
  }

résultat :

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 démarré pour JSC ''Opening Broker''
2021.02.19 19:30:47.113 Terminal Windows 7 Service Pack 1 build 7601, Intel Core i5-2520M @ 2.50GHz, 5 / 7 Go de mémoire, 41 / 287 Go de disque, IE 11, UAC, GMT+3

Si le script s'exécute de manière répétée, les valeurs initiales des variables a,b et x peuvent changer, mais le comportement global est constant :

1. Dans la première partie du script, les valeurs des variables a et b dans le code ne changent pas, mais après avoir exécuté PrintFormat("%I64d", 1), PrintFormat("a==%I64d", a) sort soudainement 1, de même pour b. Et le plus intéressant est que (a==1)==vrai et immédiatement (a==2)==vrai (pour b également) ! !! Dans le dernier appel, PrintFormat("a==%I64d, b==%I64d", a, b) montre que a==1, mais que b == la valeur qui était au début du script.

2. Dans la deuxième partie du script, j'essaie de changer la valeur de la variable non initiale. Après y=x++, la valeur de x devrait changer. Mais il reste le même (dans cette exécution ==1).

S'il vous plaît, que quelqu'un essaie d'exécuter le script et de poster la sortie.

D'où la question aux connaisseurs : s'agit-il d'un comportement normal (comme un comportement indéfini) ou d'un bug ?

 
mktr8591:

Encore une fois, à propos des variables non initialisées. Il est clair que leur valeur peut être imprévisible de quelque manière que ce soit. Mais c'est la première fois que je rencontre le fait qu'ils peuvent changer leur valeur par eux-mêmes lors de l'exécution d'une fonction (je ne l'ai pas trouvé en cherchant). Voici le code du script et ce que j'obtiens :

résultat :


terminal :
2021.02.19 19:30:47.003 Terminal Opening Broker x64 build 2755 démarré pour JSC ''Opening Broker''
2021.02.19 19:30:47.113 Terminal Windows 7 Service Pack 1 build 7601, Intel Core i5-2520M @ 2.50GHz, 5 / 7 Go de mémoire, 41 / 287 Go de disque, IE 11, UAC, GMT+3

Si le script s'exécute de manière répétée, les valeurs initiales des variables a,b et x peuvent changer, mais le comportement global est constant :

1. Dans la première partie du script, les valeurs des variables a et b dans le code ne changent pas, mais après avoir exécuté PrintFormat("%I64d", 1), PrintFormat("a==%I64d", a) sort soudainement 1, de même pour b. Et le plus intéressant est que (a==1)==vrai et immédiatement (a==2)==vrai (pour b également) ! !! Dans le dernier appel, PrintFormat("a==%I64d, b==%I64d", a, b) montre que a==1, mais que b == la valeur qui était au début du script.

2. Dans la deuxième partie du script, j'essaie de changer la valeur de la variable non initiale. Après y=x++, la valeur de x devrait changer. Mais il reste le même (dans cette exécution ==1).

S'il vous plaît, que quelqu'un essaie d'exécuter le script et de poster la sortie.

D'où la question aux connaisseurs : s'agit-il d'un comportement normal (comme un comportement indéfini) ou d'un bug ?

Ne pas initialiser vos variables est un comportement anormal. Initialiser, et il n'y aura pas de telles questions.
 
Artyom Trishkin:
Ne pas initialiser vos variables est un comportement anormal. Initialisez-le et il n'y aura pas de telles questions.

Complètement POUR.

Mais cela ne veut pas dire que le bug est introuvable ;))). Je voulais juste m'assurer que tout allait bien.

Raison: