Fehler, Irrtümer, Fragen - Seite 1681

 
Karputov Vladimir:
Dabei spielt es keine Rolle, ob es sich um laufende oder stehende Kurse handelt. Sie müssen die Bedingung prev_calculate==0 im Indikator kontrollieren - das ist der History Swap und der zweite Punkt - sparsamer Modus der Neuberechnung der geänderten Balken, das ist in Wirklichkeit rates_total -prev_calculate+1.

Sie sollten lesen, was geschrieben wurde, bevor Sie antworten. Der Code zur Reproduktion des Debugger-Fehlers! Alle Daten zur Reproduktion sind vorhanden.

Hier ist ein Skript, das den gleichen Fehler reproduziert

int Func(){ return(0); }

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

void OnStart()
{
  Func2();
}
 
fxsaber:
Sie sollten lesen, was geschrieben steht, bevor Sie antworten. Code zur Reproduktion des Debugger-Fehlers! Alle Daten für die Reproduktion sind angegeben.

Ich habe Ihnen geantwortet: Es ist Ihnen egal, wie oft OnCalculate aufgerufen wird. Ihre Aufgabe ist es, entweder eine vollständige oder eine teilweise Neuberechnung des Indikators vorzunehmen, indem Sie zwei Werte analysieren: rates_total, prev_calculate und die Bedingung, wenn prev_calculate==0.

Es gibt keine strikte Bedingung, dass OnCalculate() einmal oder zweimal aufgerufen werden muss. OnCalculate() ist niemandem etwas schuldig. Aber der Programmierer muss zwei Werte kontrollieren: rates_total, prev_calculate und die Bedingung, wenn prev_calculate==0.

 
Karputov Vladimir:
Ich habe Ihnen gesagt, dass es Ihnen egal ist, wie oft OnCalculate aufgerufen wird. Ihre Aufgabe ist es, entweder eine vollständige oder eine teilweise Neuberechnung des Indikators vorzunehmen und dabei zwei Werte zu analysieren: rates_total, prev_calculate und die Bedingung, wenn prev_calculate==0.

Mich interessiert, wie oft der Debugger aufgerufen wird und wie oft OnCalculate aufgerufen wird. Ich bin von Natur aus ein GROSSARTIGER Mensch! Und ich kümmere mich um alles.

Sie versuchen, mir etwas beizubringen, ohne das Wesentliche des Problems zu verstehen. Ich danke Ihnen natürlich. Aber hören wir unserem Gegner zu und hören wir ihn an.

 
fxsaber:

Nein, ich lasse es jetzt auf RTS laufen, wenn die Kotirs stehen. Ich habe herausgefunden, dass es nur einmal aufgerufen wird und der Debugger lügt, als ob es zwei Aufrufe wären. Code zum Spielen (auf einem Charakter laufen lassen, auf dem keine Ticks laufen)

Nachdem Sie F5 gedrückt haben, wird ein Haltepunkt erreicht. Und nach einem zweiten Druck auf F5 - ähnlich. Dies sollte zwar nicht als Bestätigung gelten, aber Sie können diese Zeile im Code kürzen und es damit versuchen.

So können Sie erkennen, was falsch ist. Achten Sie auf den Wert von i an der ersten und zweiten Haltestelle.

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:

So können Sie erkennen, wo das Problem liegt. Verfolgen Sie den i-Wert an der ersten und zweiten Haltestelle.

Ich habe sie zurückverfolgt, deshalb habe ich sie geschrieben.

Ich habe herausgefunden, dass es nur einmal aufgerufen wird, aber der Debugger lügt und zeigt es so an, als ob es zwei Aufrufe wären.

Warum kehrt der Debugger nach dem zweiten Drücken von F5 an die gleiche Stelle zurück? Bei return(0) geschieht nichts dergleichen, was korrekt ist.

 

Er lügt nicht, sondern hält zweimal an - vor der Berechnung des eingeklammerten Ausdrucks und danach, kurz vor dem Return.

Übrigens, ein sehr praktischer Trick, wie ich finde. Ich muss es mir merken. Es ist nicht notwendig, das Ergebnis in Klammern in eine separate Variable zu setzen, um den Rückgabewert vor dem Beenden zu überprüfen, der Debugger selbst wird wieder anhalten.

 
Sergei Vladimirov:

Er lügt nicht, sondern hält zweimal an - vor der Berechnung des eingeklammerten Ausdrucks und danach, kurz vor dem Return.

Übrigens, ein sehr praktischer Trick, wie ich finde. Ich muss es mir merken. Es istnicht notwendig, das Ergebnis in Klammern in eine separate Variable zu setzen, um den Rückgabewert vor dem Beenden zu überprüfen, der Debugger selbst wird zum zweiten Mal anhalten.

Ich stimme zu, dass dies praktisch ist. Aber wie kann man das Rückgabeergebnis vor dem Exit ohne eine Variable im Debugger herausfinden?
 
fxsaber:


Geben Sie den Code wie folgt ein:

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

und setzen Sie den Indikator auf das Diagramm. Laden Sie dann das Terminal neu (Sie müssen den Indikator nicht aus dem Diagramm entfernen). Sie werden sehen, dass OnCalculate() einmal, zweimal oder sogar dreimal aufgerufen werden kann. Das heißt, wie ich oben schon sagte - es gibt keine strengen Regeln.

 
Karputov Vladimir:

Geben Sie den Code wie folgt ein:

und setzen Sie den Indikator auf das Diagramm. Laden Sie dann das Terminal neu (Sie müssen den Indikator nicht aus dem Diagramm entfernen). Sie werden sehen, dass OnCalculate() einmal, zweimal oder sogar dreimal aufgerufen werden kann. Das heißt, wie ich oben schon sagte - es gibt keine strengen Regeln.

Sie zwingen mich dazu, mich darüber zu beschweren, dass Sie überhaupt nicht bereit sind zu hören, was Ihr Gegner schreibt.
 
fxsaber:
Ich stimme zu, dass dies praktisch ist. Aber wie kann ich das Rückgabeergebnis vor dem Exit ohne eine Variable im Debugger herausfinden?

Schauen Sie in den Körper von Func(), um zu sehen, was er zurückgibt, bevor er beendet wird. Ich spreche von einem besonderen Fall. Wenn der Wert direkt in Klammern berechnet werden soll, geht das natürlich nicht.

PS. Obwohl... Warum nicht? Bei der zweiten Station alle Argumente return() nachschlagen und das Ergebnis berechnen. )