Errori, bug, domande - pagina 2759

 
Bug nel debugger di MT5 (build 2450), innesco errato dei breakpoint impostati manualmente:
void test(){
   if(false){
      int i = 1;      // вручную установленная точка останова
   }   
}                     // место срабатывания точки останова при отладке

void OnStart(){
   test();   
}


UPD:
Grazie per la critica, sono tornato al progetto originale e ho evidenziato il problema riscontrato senza un'eccessiva ottimizzazione del codice:
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:
Bug nel debugger di MT5 (build 2450), innesco errato dei breakpoint impostati manualmente:

Puoi spiegare per favore perché devi fare tutto questo casino?

if(false)
Usate il debugger?
 
Sergey Chalyshev:

Puoi spiegare per favore perché dobbiamo girare il codice in questo modo?

Usate il debug?

Il codice mostra un BAG in cui la condizione non può essere inserita, ma il breakpoint si attiva ancora in un punto completamente diverso del codice.
Altre domande?

 

Ha scritto il seguente messaggio al supporto della scoperta.

Testato il robot su una storia. Ho ottenuto dei risultati strani. La parte inferiore della tabella è nello screenshot. Se si considera che faccio trading con 100.000 rubli, il saldo negativo di -6049 con il 17% di drawdown sembra incredibile. Infatti, quando aproil grafico testando questo set di parametri, ottengo un saldo positivo al drawdown specificato. L'account è reale 75287 (come si vede nella foto). Quale può essere la ragione di tale comportamento del programma?

Posso anche aggiungere che tutti i set di parametri si comportano in questo modo.

Ho la risposta:

Sfortunatamente, tali questioni non sono nell'ambito del supporto tecnico.

Si prega di contattare gli sviluppatori del terminale.

Quale potrebbe essere la ragione?

 
Sergey Dzyublik:

Il codice mostra un BAG in cui una condizione non può essere inserita, ma innesca comunque un breakpoint in un punto completamente diverso del codice.
Altre domande?

Tutto mi sembra giusto. Il programma ignora if(false) e si attiva al frammento di codice più vicino).

 
TraSer:

Mi sembra che tutto sia corretto. Il programma ignora if(false) e si attiva nel punto più vicino del codice).

Questo non è affatto corretto. Se ho bisogno di fermarmi solo quando una condizione è soddisfatta, e lo stop sarà su ogni tick, diventerò pazzo mentre...

 
Sergey Dzyublik:

Ci sono altre domande?

cosa ti fa pensare che il compilatore non abbia buttato via il testo della condizione if(false) {....} durante la compilazione del progetto?

un punto di interruzione appare sul primo carattere di testo ME del resto del codice perché ME non può spostare stringhe, ripiegamenti e altre meraviglie VS

ME non può analizzare il codice in tempo reale, al massimo sono disponibili autosostituzioni

anche se se è un bug, è un bug

 
Igor Makanu:

cosa ti fa pensare che il compilatore non abbia buttato via il testo della condizione if(false) {....} durante la compilazione del progetto?

il breakpoint era al primo carattere di testo ME del resto del codice perché ME non può spostare stringhe, ripiegamenti e altre meraviglie VS

ME non può analizzare il codice in tempo reale, al massimo sono disponibili autosostituzioni

anche se se è un bug, è un bug.

È necessario testarlo con una condizione normale. Ho ricevuto questo l'altro giorno: quando si esegue il codice passo dopo passo

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

nel debugger, con una condizione esplicita non soddisfatta, le chiamate di funzione non sono state eseguite, ma return; sì. Ho deciso che poiché non c'è più codice dopo la parentesi curva e c'è solo un'altra parentesi curva che termina void OnTick(), il compilatore ha spostato return

 
Alexey Viktorov:

Questo dovrebbe essere testato con una condizione normale.

Sì, è di questo che sto parlando, non falso, ma qualcosa di simile:

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

di solito il compilatore non vede una tale condizione durante la compilazione

 
Grazie per la critica, sono tornato alla bozza originale e ho evidenziato il problema riscontrato senza ottimizzare troppo il codice:
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
}