Fehler, Irrtümer, Fragen - Seite 2759

 
Fehler im MT5-Debugger (Build 2450), der manuell gesetzte Haltepunkte falsch auslöst:
void test(){
   if(false){
      int i = 1;      // вручную установленная точка останова
   }   
}                     // место срабатывания точки останова при отладке

void OnStart(){
   test();   
}


UPD:
Danke für die Kritik, bin zum ursprünglichen Projekt zurückgegangen und habe das Problem hervorgehoben, das ohne Überoptimierung des Codes aufgetreten ist:
class A{
public:
   bool m_flag;
   A* m_next;
   A(bool flag) : m_flag(flag){}
   
   void test(){
      if(m_flag){
         printf("1");
         m_next = m_next;    // Вручную установленная точка останова срабатывает как для false так и true условий
         //m_next = &this;   // Ok
      }   
   }
};

void OnStart(){
  {A a(false); a.test();}   // Result: breakpoint              Expected result: 
  {A a(true);  a.test();}   // Result: printf + breakpoint     Expected result: printf + breakpoint
}
 
Sergey Dzyublik:
Fehler im MT5-Debugger (Build 2450), der manuell gesetzte Haltepunkte falsch auslöst:

Können Sie mir bitte erklären, warum Sie sich all diese Mühe machen müssen?

if(false)
Verwenden Sie den Debugger?
 
Sergey Chalyshev:

Können Sie uns bitte erklären, warum wir uns auf diese Weise verdrehen müssen?

Verwenden Sie Debugging?

Der Code zeigt eine BAG an, bei der die Bedingung nicht eingegeben werden kann, aber der Haltepunkt wird trotzdem an einer völlig anderen Stelle im Code ausgelöst.
Noch Fragen?

 

Ich habe die folgende Nachricht an den Discovery Support geschrieben.

Teste den Roboter an einer Geschichte. Ich habe einige seltsame Ergebnisse erhalten. Der untere Teil der Tabelle ist auf dem Bildschirmfoto zu sehen. Wenn man bedenkt, dass ich mit 100.000 Rubel handle, erscheint der negative Saldo von -6049 mit 17% Drawdown unglaublich. Wenn ichdas Diagramm öffneund diesen Parametersatzteste, erhalte ich in der Tat einen positiven Saldo bei dem angegebenen Drawdown. Das Konto ist real 75287 (wie auf dem Foto zu sehen). Was könnte der Grund für ein solches Verhalten des Programms sein?

Ich kann auch hinzufügen, dass sich alle Parametersätze auf diese Weise verhalten.

Ich habe die Antwort:

Leider fallen solche Fragen nicht in den Bereich des technischen Supports.

Bitte wenden Sie sich an die Entwickler des Terminals.

Was könnte der Grund dafür sein?

 
Sergey Dzyublik:

Der Code zeigt eine BAG, in der eine Bedingung nicht eingegeben werden kann, löst aber dennoch einen Haltepunkt an einer völlig anderen Stelle im Code aus.
Noch Fragen?

Mir scheint alles richtig zu sein. Das Programm ignoriert if(false) und löst an der Stelle aus, die ihm nach dem Code am nächsten liegt.)

 
TraSer:

Ich habe den Eindruck, dass alles richtig ist. Das Programm ignoriert if(false) und löst an der nächstgelegenen Stelle im Code aus).

Das ist überhaupt nicht richtig. Wenn ich nur stoppen muss, wenn eine Bedingung erfüllt ist, und der Stopp bei jedem Tick erfolgt, werde ich verrückt, während...

 
Sergey Dzyublik:

Haben Sie weitere Fragen?

Wie kommen Sie darauf, dass der Compiler den Text der if(false)-Bedingung {....} beim Kompilieren des Projekts nicht weggeworfen hat?

ein Haltepunkt erscheint auf dem ersten ME-Textzeichen des restlichen Codes, da ME keine Strings, Foldings und andere VS-Wunder verschieben kann

ME kann den Code nicht in Echtzeit analysieren, allenfalls sind Autosubstitutionen verfügbar

aber wenn es ein Fehler ist, ist es ein Fehler

 
Igor Makanu:

Wie kommen Sie darauf, dass der Compiler den Text der if(false)-Bedingung {....} beim Kompilieren des Projekts nicht weggeworfen hat?

der Haltepunkt war am ersten ME-Textzeichen des restlichen Codes, weil ME keine Strings, Foldings und andere VS-Wunder verschieben kann

ME kann den Code nicht in Echtzeit analysieren, allenfalls sind Autosubstitutionen verfügbar

aber wenn es ein Fehler ist, ist es ein Fehler.

Sie müssen es unter normalen Bedingungen testen. Neulich hatte ich folgendes Problem: Wenn ich den Code Schritt für Schritt ausführe

  if(desiredProfit > 0 && summProfit > desiredProfit)
   {
    CloseAllPosition();
    DeleteAllPending();
    openSeries = Should_I_open;
    return;
   }

im Debugger, wenn eine explizite Bedingung nicht erfüllt ist, wurden Funktionsaufrufe nicht ausgeführt, aber return; ist. Ich habe beschlossen, dass der Compiler, da nach der geschwungenen Klammer kein weiterer Code folgt und es nur eine weitere geschwungene Klammer gibt, die das void OnTick() beendet, return

 
Alexey Viktorov:

Dies sollte in einem normalen Zustand getestet werden.

Ja, das ist es, was ich meine, nicht falsch, sondern so etwas wie:

int i=1;
if(--i == 0)...

Normalerweise erkennt der Compiler eine solche Bedingung beim Kompilieren nicht.

 
Danke für die Kritik, ich bin zum ursprünglichen Entwurf zurückgegangen und habe das aufgetretene Problem hervorgehoben, ohne den Code zu sehr zu optimieren:
class A{
public:
   bool m_flag;
   A* m_next;
   A(bool flag) : m_flag(flag){}
   
   void test(){
      if(m_flag){
         printf("1");
         m_next = m_next;    // Вручную установленная точка останова срабатывает как для false так и true условий
         //m_next = &this;   // Ok
      }   
   }
};

void OnStart(){
  {A a(false); a.test();}   // Result: breakpoint              Expected result: 
  {A a(true);  a.test();}   // Result: printf + breakpoint     Expected result: printf + breakpoint
}
Grund der Beschwerde: