Errori, bug, domande - pagina 2966

 
fxsaber:

Discusso.

L'errore non è evidente lì perché: "Forse è stato inteso in quel modo".

Qui è dopo l'esecuzione della funzione GetLastError() = ERR_WRONG_STRING_DATE. Se la data è sbagliata, perché il risultato non è sbagliato?

 
fxsaber:

Ne dubito.

Non mi sono preoccupato... Ho contato - tu hai 30 linee, io ho 13

 
A100:

Non mi sono preoccupato... Ho contato - tu hai 30 linee, io ne ho 13.

L'importante è ottenere lo stesso risultato e non perdere le prestazioni.

 

Errore nella ricerca binaria di un valore in una matrice ordinata:

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

Risultato:

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

Invece di 2 dovrebbe essere 3

 
Aliaksandr Hryshyn:

Errore nella ricerca binaria di un valore in una matrice ordinata:

Risultato:

Invece di 2 dovrebbe essere 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:

Non si tratta di aggirare l'errore, ma di correggerlo, soprattutto perché questa funzione può essere usata in molti sorgenti, anche standard. Ed è possibile che sia usato nel codice del terminale stesso, editor di codice...

 
Aliaksandr Hryshyn:

Non si tratta di aggirare l'errore, ma di correggerlo, soprattutto perché questa funzione può essere usata in molti sorgenti, anche standard. Ed è possibile che sia usato nel codice del terminale stesso, editor di codice...

Penso che il problema sia con bit grandi in una situazione in cui quasi tutti i bit sono occupati. è incredibile che qualcuno abbia trovato questo errore dopo tanto tempo.


 
DMITRII PECHERITSA:

Probabilmente lo correggeranno. secondo me, il problema è con i lunghi di grandi dimensioni in una situazione in cui quasi tutti i bit sono occupati. è sorprendente che qualcuno abbia trovato questo bug dopo così tanto tempo.


Sono sorpreso che non abbiano trovato questo bug in una funzione usata frequentemente in così tanto tempo.

 

Di nuovo, sulle variabili non inizializzate. È chiaro che il loro valore può essere imprevedibile in qualsiasi modo. Ma questa è la prima volta che ho incontrato che possono cambiare il loro valore da soli a runtime di una funzione (non l'ho trovato cercando). Ecco il codice dello script e quello che ottengo:

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

risultato:

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

terminale:
2021.02.19 19:30:47.003 Terminale Apertura Broker x64 build 2755 avviato per JSC ''Opening Broker''
2021.02.19 19 19:30:47.113 Terminale Windows 7 Service Pack 1 build 7601, Intel Core i5-2520M @ 2.50GHz, 5 / 7 Gb di memoria, 41 / 287 Gb di disco, IE 11, UAC, GMT+3

Se lo script viene eseguito ripetutamente, i valori iniziali delle variabili a,b e x possono cambiare, ma il comportamento complessivo è costante:

1. Nella prima parte dello script, i valori delle variabili a e b nel codice non cambiano, ma dopo aver eseguito PrintFormat("%I64d", 1) improvvisamente PrintFormat("a==%I64d", a) produce 1, lo stesso per b. E la cosa più interessante è che (a==1)==vero e immediatamente (a==2)==vero (anche per b)!!! Nell'ultima chiamata PrintFormat("a==%I64d, b==%I64d", a, b) mostra a==1, ma b == il valore che era all'inizio dello script.

2. Nella seconda parte dello script cerco di cambiare il valore della variabile uninitial. Dopo y=x++ il valore di x dovrebbe cambiare. Ma rimane lo stesso (in questa corsa ==1).

Per favore, qualcuno provi ad eseguire lo script e a postare l'output.

Quindi domanda ai conoscitori - questo è un comportamento normale (come un comportamento indefinito) o è un bug?

 
mktr8591:

Di nuovo, sulle variabili non inizializzate. È chiaro che il loro valore può essere imprevedibile in qualsiasi modo. Ma questa è la prima volta che ho incontrato che possono cambiare il loro valore da soli a runtime di una funzione (non l'ho trovato cercando). Ecco il codice dello script e quello che ottengo:

risultato:


terminale:
2021.02.19 19:30:47.003 Terminale Apertura Broker x64 build 2755 avviato per JSC ''Opening Broker''
2021.02.19 19 19:30:47.113 Terminale Windows 7 Service Pack 1 build 7601, Intel Core i5-2520M @ 2.50GHz, 5 / 7 Gb di memoria, 41 / 287 Gb di disco, IE 11, UAC, GMT+3

Se lo script viene eseguito ripetutamente, i valori iniziali delle variabili a,b e x possono cambiare, ma il comportamento complessivo è costante:

1. Nella prima parte dello script, i valori delle variabili a e b nel codice non cambiano, ma dopo aver eseguito PrintFormat("%I64d", 1) improvvisamente PrintFormat("a==%I64d", a) produce 1, lo stesso per b. E la cosa più interessante è che (a==1)==vero e immediatamente (a==2)==vero (anche per b)!!! Nell'ultima chiamata PrintFormat("a==%I64d, b==%I64d", a, b) mostra a==1, ma b == il valore che era all'inizio dello script.

2. Nella seconda parte dello script cerco di cambiare il valore della variabile uninitial. Dopo y=x++ il valore di x dovrebbe cambiare. Ma rimane lo stesso (in questa corsa ==1).

Per favore, qualcuno provi ad eseguire lo script e a postare l'output.

Quindi domanda ai conoscitori - questo è un comportamento normale (come un comportamento indefinito) o è un bug?

Non inizializzare le vostre variabili è un comportamento anomalo. Inizializza, e non ci saranno queste domande.