Fehler, Irrtümer, Fragen - Seite 2966

 
fxsaber:

Diskutiert.

Der Fehler ist dort nämlich nicht offensichtlich: "Vielleicht war das so beabsichtigt".

Hier ist es nach Ausführung der Funktion GetLastError() = ERR_WRONG_STRING_DATE. Wenn das Datum falsch ist, warum ist dann das Ergebnis nicht falsch?

 
fxsaber:

Das bezweifle ich.

Ich habe mir nicht die Mühe gemacht... Ich habe gezählt - Sie haben 30 Zeilen, ich habe 13

 
A100:

Ich habe mir nicht die Mühe gemacht... Ich habe gezählt - Sie haben 30 Zeilen, ich habe 13.

Die Hauptsache ist, das gleiche Ergebnis zu erzielen und nicht an Leistung zu verlieren.

 

Fehler bei der binären Suche nach einem Wert in einem sortierten Array:

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

Ergebnis:

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

Anstelle von 2 sollte es 3 sein

 
Aliaksandr Hryshyn:

Fehler bei der binären Suche nach einem Wert in einem sortierten Array:

Ergebnis:

Anstelle von 2 sollte es 3 sein

//+------------------------------------------------------------------+
//| если добавить еще одно положительное число, то ошибки нет. где-то|
//|косяк в алгоритме бинарного поиска при переходе с минуса на плюс. |
//+------------------------------------------------------------------+
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:

Es geht nicht darum, den Fehler zu umgehen, sondern ihn zu beheben, zumal diese Funktion in vielen Quellen, auch Standardquellen, verwendet werden kann. Und es ist möglich, dass es im Terminalcode selbst, im Code-Editor... verwendet wird.

 
Aliaksandr Hryshyn:

Es geht nicht darum, den Fehler zu umgehen, sondern ihn zu beheben, zumal diese Funktion in vielen Quellen, auch Standardquellen, verwendet werden kann. Und es ist möglich, dass es im Terminalcode selbst, im Code-Editor... verwendet wird.

Ich denke, es ist ein Problem mit großen Bits in einer Situation, in der fast alle Bits belegt sind. Es ist erstaunlich, dass jemand diesen Fehler nach so langer Zeit gefunden hat.


 
DMITRII PECHERITSA:

Sie werden es wahrscheinlich beheben. Meiner Meinung nach ist das Problem mit großen Longs in einer Situation, in der fast alle Bits besetzt sind. es ist überraschend, dass jemand diesen Fehler nach so viel Zeit gefunden hat.


Ich bin überrascht, dass sie diesen Fehler in einer häufig verwendeten Funktion so lange nicht gefunden haben.

 

Nochmals zu nicht initialisierten Variablen. Es ist klar, dass ihr Wert in keiner Weise vorhersehbar sein kann. Aber dies ist das erste Mal, dass ich darauf gestoßen bin, dass sie ihren Wert zur Laufzeit einer Funktion selbst ändern können (ich habe es nicht durch Suchen gefunden). Hier ist der Skriptcode und das Ergebnis:

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

Ergebnis:

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 gestartet für JSC ''Opening Broker''
2021.02.19 19 19:30:47.113 Terminal Windows 7 Service Pack 1 build 7601, Intel Core i5-2520M @ 2.50GHz, 5 / 7 Gb Arbeitsspeicher, 41 / 287 Gb Festplatte, IE 11, UAC, GMT+3

Wenn das Skript wiederholt läuft, können sich die Anfangswerte der Variablen a,b und x ändern, aber das Gesamtverhalten ist konstant:

1. Im ersten Teil des Skripts ändern sich die Werte der Variablen a und b im Code nicht, aber nach der Ausführung von PrintFormat("%I64d", 1) gibt PrintFormat("a==%I64d", a) plötzlich 1 aus, dasselbe gilt für b. Und interessanterweise ist (a==1)==wahr und sofort (a==2)==wahr (auch für b)!!! Beim letzten Aufruf zeigt PrintFormat("a==%I64d, b==%I64d", a, b) a==1, aber b == der Wert, der am Anfang des Skripts stand.

2. Im zweiten Teil des Skripts versuche ich, den Wert der uninitialen Variablen zu ändern. Nach y=x++ sollte sich der Wert von x ändern. Aber es bleibt gleich (in diesem Lauf ==1).

Bitte versuchen Sie, das Skript auszuführen und die Ausgabe zu posten.

Daher die Frage an die Kenner: Ist dieses Verhalten normal (wie undefiniertes Verhalten) oder ist es ein Fehler?

 
mktr8591:

Nochmals zu nicht initialisierten Variablen. Es ist klar, dass ihr Wert in keiner Weise vorhersehbar sein kann. Aber dies ist das erste Mal, dass ich darauf gestoßen bin, dass sie ihren Wert zur Laufzeit einer Funktion selbst ändern können (ich habe es nicht durch Suchen gefunden). Hier ist der Skriptcode und was ich erhalte:

Ergebnis:


terminal:
2021.02.19 19:30:47.003 Terminal Opening Broker x64 build 2755 gestartet für JSC ''Opening Broker''
2021.02.19 19 19:30:47.113 Terminal Windows 7 Service Pack 1 build 7601, Intel Core i5-2520M @ 2.50GHz, 5 / 7 Gb Arbeitsspeicher, 41 / 287 Gb Festplatte, IE 11, UAC, GMT+3

Wenn das Skript wiederholt läuft, können sich die Anfangswerte der Variablen a,b und x ändern, aber das Gesamtverhalten ist konstant:

1. Im ersten Teil des Skripts ändern sich die Werte der Variablen a und b im Code nicht, aber nach der Ausführung von PrintFormat("%I64d", 1) gibt PrintFormat("a==%I64d", a) plötzlich 1 aus, dasselbe gilt für b. Und interessanterweise ist (a==1)==wahr und sofort (a==2)==wahr (auch für b)!!! Beim letzten Aufruf zeigt PrintFormat("a==%I64d, b==%I64d", a, b) a==1, aber b == der Wert, der am Anfang des Skripts stand.

2. Im zweiten Teil des Skripts versuche ich, den Wert der uninitialen Variablen zu ändern. Nach y=x++ sollte sich der Wert von x ändern. Aber es bleibt gleich (in diesem Lauf ==1).

Bitte versuchen Sie, das Skript auszuführen und die Ausgabe zu posten.

Daher die Frage an die Kenner: Ist dieses Verhalten normal (wie undefiniertes Verhalten) oder ist es ein Fehler?

Das Nichtinitialisieren Ihrer Variablen ist ein abnormales Verhalten. Nach der Initialisierung gibt es keine solchen Fragen mehr.