Errori, bug, domande - pagina 1681

 
Karputov Vladimir:
Non fa alcuna differenza se le citazioni vanno o stanno in piedi. È necessario controllare la condizione prev_calculate==0 nell'indicatore - questo è lo swap della storia e il secondo punto - il modo parsimonioso di ricalcolo delle barre modificate, cioè in effetti rates_total -prev_calculate+1.

Dovresti leggere ciò che è scritto prima di rispondere. Il codice per riprodurre il bug del debugger! Tutti i dati per riprodurlo sono dati.

Ecco uno script per riprodurre lo stesso bug

int Func(){ return(0); }

int Func2()
{
//  return(0); // если расскоментировать и здесь поставить точку останова, то отладчик отработает, как надо  
  return(Func()); // здесь поставить точку останова (F9)
}

void OnStart()
{
  Func2();
}
 
fxsaber:
Dovresti leggere ciò che è scritto prima di rispondere. Codice per riprodurre il bug del debugger! Tutti i dati per la riproduzione sono indicati.

Ti ho risposto - non ti interessa quante volte viene chiamato OnCalculate. Il vostro compito è quello di fornire un ricalcolo completo o parziale dell'indicatore analizzando due valori: rates_total, prev_calculate e la condizione quando prev_calculate==0.

Non c'è una condizione rigorosa che OnCalculate() debba essere chiamata una o due volte. OnCalculate() non deve niente a nessuno. Ma il programmatore deve controllare due valori: rates_total, prev_calculate e la condizione quando prev_calculate==0.

 
Karputov Vladimir:
Te l'ho detto - non ti interessa quante volte viene chiamato OnCalculate. Il vostro compito è quello di fornire un ricalcolo completo o parziale dell'indicatore, analizzando due valori: rates_total, prev_calculate e la condizione quando prev_calculate==0.

Mi interessa quante volte viene chiamato il debugger e quante volte viene chiamato OnCalculate. Sono una persona AWESOME per natura! E mi interessa tutto.

State cercando di insegnarmi qualcosa senza capire l'essenza del problema. Grazie, naturalmente. Ma ascoltiamo e sentiamo il nostro avversario.

 
fxsaber:

No, lo sto facendo funzionare su RTS ora, quando i kotir sono in piedi. Ho capito che viene chiamato una volta e il debugger mente, mostrando come se fossero due. Codice per giocare (eseguire su un personaggio in cui non ci sono ticchettii)

Dopo aver premuto F5, il sistema raggiungerà un punto di interruzione. E dopo una seconda pressione su F5 - allo stesso modo. Mentre questo non dovrebbe essere - come conferma, potete accorciare quella linea nel codice e provare con questo.

È così che si può vedere cosa c'è di sbagliato. Guarda il valore di i al primo e al secondo arresto.

int Func(int& i)
{
        i++;
        return 0;
}

int OnCalculate( const int rates_total,
                 const int prev_calculated,
                 const datetime &time[],
                 const double &open[],
                 const double &high[],
                 const double &low[],
                 const double &close[],
                 const long &tick_volume[],
                 const long &volume[],
                 const int &spread[] )
{
        int i = 1;
        return(Func(i)); // здесь поставить точку останова (F9)
}
 
Sergei Vladimirov:

In questo modo si può vedere qual è il problema. Traccia il valore di i al primo e al secondo arresto.

L'ho rintracciato, per questo l'ho scritto.

Ho scoperto che viene chiamato una volta, ma il debugger mente, mostrandolo come se fossero due.

Perché il debugger mi riporta allo stesso punto dopo la seconda pressione su F5? Non succede niente del genere con return(0), che è corretto.

 

Non mente, si ferma due volte - prima di calcolare l'espressione tra parentesi e dopo di essa, appena prima del ritorno.

A proposito, un trucco molto utile, secondo me. Ho bisogno di ricordarlo. Non c'è bisogno di mettere il risultato tra parentesi in una variabile separata per controllare il valore di ritorno prima di uscire, il debugger stesso si fermerà di nuovo.

 
Sergei Vladimirov:

Non mente, si ferma due volte - prima di calcolare l'espressione tra parentesi e dopo di essa, appena prima del ritorno.

A proposito, un trucco molto utile, secondo me. Ho bisogno di ricordarlo.Non c'è bisogno di mettere il risultato tra parentesi in una variabile separata per controllare il valore di ritorno prima di uscire, il debugger stesso si fermerà per la seconda volta.

Sono d'accordo che questo è conveniente. Ma come scoprire il risultato di ritorno prima di uscire senza una variabile nel debugger?
 
fxsaber:


Mettete il codice in questo modo:

int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
   int i=1;
   Print("Перед: i ",i,",rates_total ",rates_total,", prev_calculated ",prev_calculated);
   int rezult=Func(i);
   Print("После: i ",i,",rates_total ",rates_total,", prev_calculated ",prev_calculated);
   return(rezult); // здесь поставить точку останова (F9)
  }

e mettere l'indicatore sul grafico. E poi ricaricare il terminale (non è necessario rimuovere l'indicatore dal grafico). Vedrete che OnCalculate() può essere chiamata una o due o anche tre volte. Cioè, come ho detto sopra - non ci sono regole rigide.

 
Karputov Vladimir:

Mettete il codice in questo modo:

e mettere l'indicatore sul grafico. E poi ricaricare il terminale (non è necessario rimuovere l'indicatore dal grafico). Vedrete che OnCalculate() può essere chiamata una o due o anche tre volte. Cioè, come ho detto sopra - non ci sono regole rigide.

Mi costringi a lamentarmi di te che sei completamente restio ad ascoltare ciò che scrive il tuo avversario.
 
fxsaber:
Sono d'accordo che questo è utile. Ma come posso scoprire il risultato di ritorno prima dell'uscita senza una variabile nel debugger?

Guardate nel corpo di Func() per vedere cosa restituisce prima di uscire. Sto parlando di un caso speciale. Se il valore sarà calcolato direttamente tra parentesi, ovviamente, non è possibile.

PS. Anche se... Perché no? Alla seconda fermata, cerca tutti gli argomenti return() e calcola il risultato. )