Erreurs, bugs, questions - page 1681

 
fxsaber:
Vous devriez lire ce qui est écrit avant de répondre. Code pour reproduire le bug du débogueur ! Toutes les données pour la reproduction sont données.

Je vous ai répondu - vous ne vous souciez pas du nombre de fois où OnCalculate est appelé. Votre tâche consiste à fournir un recalcul complet ou partiel de l'indicateur en analysant deux valeurs : rates_total, prev_calculate et la condition lorsque prev_calculate==0.

Il n'y a pas de condition stricte selon laquelle OnCalculate() doit être appelé une ou deux fois. OnCalculate() ne doit rien à personne. Mais le programmeur doit contrôler deux valeurs : rates_total, prev_calculate et la condition lorsque prev_calculate==0.

 
Karputov Vladimir:
Je vous l'ai dit - vous ne vous souciez pas du nombre de fois que OnCalculate est appelé. Votre tâche consiste à fournir un recalcul complet ou partiel de l'indicateur, en analysant deux valeurs : rates_total, prev_calculate et la condition lorsque prev_calculate==0.

Je me soucie du nombre de fois où le débogueur est appelé et du nombre de fois où OnCalculate est appelé. Je suis une personne AWESOME par nature ! Et je me soucie de tout.

Vous essayez de m'apprendre quelque chose sans comprendre l'essence du problème. Merci, bien sûr. Mais écoutons et entendons notre adversaire.

 
fxsaber:

Nan, je l'utilise en RTS maintenant, quand les kotirs sont debout. J'ai compris que c'est appelé une fois et que le débogueur ment, montrant comme si c'était deux. Code pour jouer (exécuter sur un personnage où il n'y a pas de ticks)

Après avoir appuyé sur F5, il y aura un point d'arrêt. Et après une seconde pression sur F5 - de même. Bien que cela ne doive pas être - comme une confirmation, vous pouvez raccourcir cette ligne dans le code et essayer avec elle.

C'est comme ça que tu peux voir ce qui ne va pas. Observez la valeur de i aux premier et deuxième arrêts.

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:

C'est ainsi que vous pouvez voir quel est le problème. Tracez la valeur i aux premier et deuxième arrêts.

Je l'ai tracé, c'est pour ça que je l'ai écrit.

J'ai découvert qu'il n'est appelé qu'une fois et que le débogueur ment en le montrant comme s'il y en avait deux.

Pourquoi le débogueur me renvoie-t-il au même endroit après la deuxième pression sur F5 ? Rien de tel ne se produit avec return(0), ce qui est correct.

 

Il ne ment pas, il s'arrête deux fois - avant de calculer l'expression entre parenthèses, et après, juste avant le retour.

Au fait, c'est une astuce très pratique, à mon avis. Je dois m'en souvenir. Il n'est pas nécessaire de mettre le résultat entre parenthèses dans une variable séparée pour vérifier la valeur de retour avant la sortie, le débogueur lui-même s'arrêtera à nouveau.

 
Sergei Vladimirov:

Il ne ment pas, il s'arrête deux fois - avant de calculer l'expression entre parenthèses, et après, juste avant le retour.

Au fait, c'est une astuce très pratique, à mon avis. Je dois m'en souvenir. Iln'est pas nécessaire de mettre le résultat entre parenthèses dans une variable séparée pour vérifier la valeur de retour avant la sortie, le débogueur lui-même s'arrêtera pour la deuxième fois.

Je suis d'accord pour dire que c'est pratique. Mais comment connaître le résultat du retour avant la sortie sans variable dans le débogueur ?
 
fxsaber:


Mettez le code comme ceci :

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

et mettre l'indicateur sur le graphique. Et ensuite, rechargez le terminal (vous n'avez pas besoin de retirer l'indicateur du graphique). Vous verrez que OnCalculate() peut être appelé une, deux ou même trois fois. C'est-à-dire, comme je l'ai dit plus haut, qu'il n'y a pas de règles strictes.

 
Karputov Vladimir:

Mettez le code comme ceci :

et mettre l'indicateur sur le graphique. Puis rechargez le terminal (il n'est pas nécessaire de retirer l'indicateur du graphique). Vous verrez que OnCalculate() peut être appelé une, deux ou même trois fois. C'est-à-dire, comme je l'ai dit plus haut, qu'il n'y a pas de règles strictes.

Vous m'obligez à me plaindre du fait que vous ne voulez absolument pas entendre ce que votre adversaire écrit.
 
fxsaber:
Je suis d'accord pour dire que c'est pratique. Mais comment puis-je connaître le résultat du retour avant la sortie sans variable dans le débogueur ?

Regardez dans le corps de Func() pour voir ce qu'il retourne avant de se terminer. Je parle d'un cas particulier. Si la valeur sera calculée directement entre parenthèses, bien sûr, vous ne pouvez pas.

PS. Bien que... Pourquoi pas ? Au deuxième arrêt, cherchez tous les arguments return() et calculez le résultat. )

 
fxsaber:
Vous me forcez à me plaindre du fait que vous ne voulez absolument pas entendre ce que votre adversaire écrit.
C'est votre droit, ma tâche est de vous informer qu'il n'y a pas de règles strictes sur le nombre d'appels à OnCalculate() - car cette fonction reflète essentiellement la réaction aux événements : soit la pagination de l'historique, soit la modification de l'historique (arrivée de nouveaux ticks), soit la préparation de l'environnement de trading.