Erreurs, bugs, questions - page 2493

 
Les commentaires non liés à ce sujet ont été déplacés vers "Questions des débutants de MQL5 MT5 MetaTrader 5".
 
Les commentaires non liés à ce sujet ont été déplacés vers "Questions des débutants de MQL5 MT5 MetaTrader 5".
 

Une erreur s'est produite

...tested with error "critical runtime error 502 in OnTester function (array out of range, module ....ex5, file ....mqh, line 237, col 51...

Voici le code lui-même :

//+-------------------
   // коррекция
   int      correcton_index[3];
            correcton_index[0]   = 1;
            correcton_index[1]   = (int)MathRound(balance_arr_size / 2);
            correcton_index[2]   = balance_arr_size;
   int      correcton_index3[5];
            correcton_index3[0]  =  1;
            correcton_index3[1]  = (int)MathRound(correcton_index[1] / 2);
            correcton_index3[2]  = correcton_index[1];
            correcton_index3[3]  = (int)MathRound((balance_arr_size - correcton_index[1]) / 2);
            correcton_index3[4]  = balance_arr_size;
   int      correcton_index7[9];
            correcton_index7[0]  = 1;
            correcton_index7[1]  = (int)MathRound(correcton_index3[1] / 2);
            correcton_index7[2]  = correcton_index3[1];
            correcton_index7[3]  = (int)MathRound((correcton_index3[2] - correcton_index3[1]) / 2);
            correcton_index7[4]  = correcton_index3[2];
            correcton_index7[5]  = (int)MathRound((correcton_index3[3] - correcton_index3[2]) / 2);
            correcton_index7[6]  = correcton_index3[3];
            correcton_index7[7]  = (int)MathRound((balance_arr_size - correcton_index3[3]) / 2);
            correcton_index7[8]  = balance_arr_size;
   
   double   correcton   = NormalizeDouble((balance_arr[correcton_index[2]-1] / balance_arr[correcton_index[1]-1]) / (balance_arr[correcton_index[1]-1] / balance_arr[correcton_index[0]-1]),8);
   double   correcton3[3];
   double   correcton7[7];
   double   crr         = 1;
   ArrayInitialize(correcton3,EMPTY_VALUE);
   ArrayInitialize(correcton7,EMPTY_VALUE);
   for(int i = 0; i < 3; i++)
   {
      correcton3[i]  = NormalizeDouble((balance_arr[correcton_index3[i+2]-1] / balance_arr[correcton_index3[i+1]-1]) / (balance_arr[correcton_index3[i+1]-1] / balance_arr[correcton_index3[i+0]-1]),8);
      crr            = NormalizeDouble(crr * correcton3[i],8);
   }
   correcton         = NormalizeDouble(correcton * crr,8);
   crr               = 1;
   for(int i = 0; i < 7; i++)
   {
      correcton7[i]  = NormalizeDouble((balance_arr[correcton_index7[i+2]-1] / balance_arr[correcton_index7[i+1]-1]) / (balance_arr[correcton_index7[i+1]-1] / balance_arr[correcton_index7[i+0]-1]),8);
      crr            = NormalizeDouble(crr * correcton7[i],8);
   }
   correcton         = NormalizeDouble(correcton * crr,8);

Lorsque i = 6,correcton_index7[i+2] (i+2=8) ne peut pasdépasser les limites du tableau. D'autant plus que la boucle précédente n'a pas généré la même erreur. Qu'est-ce que je rate ?

 
Сергей Таболин:

Une erreur s'est produite

Voici le code lui-même :

Lorsque i = 6,correcton_index7[i+2] (i+2=8) ne peut pas dépasser les limites du tableau. D'autant plus que la boucle précédente n'a pas généré la même erreur. Qu'est-ce que je rate ?

Danscorrecton3[3] ; vous spécifiez trois éléments.
Et la boucle est appelée quatre fois.

Dans
correcton7[7] ; vous spécifiez sept éléments.
Et exécutez la boucle huit fois
.

 
Roman:

Danscorrecton3[3] ; vous spécifiez trois éléments.
Et vous exécutez la boucle quatre fois.

Dans
correcton7[7 ] ; vous spécifiez sept éléments.
Et vous exécutez la boucle huit fois.

Comptons sur nos doigts : i=0 et il est incrémenté de 1 à chaque boucle. Cela fonctionne jusqu'à i<7. La question pour vous (comptez sur vos doigts) est de savoir combien de fois la boucle sera exécutée ?

 
Oui, désolé, je n'ai pas vu qu'il n'y a pas de boucle dans la condition =

Il ne peut pas y avoir de problème ici ?
correcton_index[0]   = 1;
correcton_index3[0]  = 1;  
 correcton_index7[0]  = 1;
Vous spécifiez des éléments zéro et y affectez une valeur.
 
Roman:
Oui, désolé, je n'ai pas vu que dans l'état du cycle n'a pas =

Il ne peut pas y avoir de problème ici ?
Vous spécifiez des éléments zéro et y affectez une valeur.

Merci de votre volonté d'aider, mais commencez par trier les tableaux vous-même. )))

 
Сергей Таболин:

Merci de votre volonté d'aider, mais commencez par trier les tableaux vous-même. )))

La déclaration d'un tableau et l'itération sur les éléments d'un tableau sont deux choses différentes.)

 
Roman:

La déclaration d'un tableau et l'itération sur les éléments d'un tableau sont deux choses différentes.)

   int      correcton_index7[9];        // объявление
            correcton_index7[0]  = 1;   // присвоение значения
            correcton_index7[1]  = (int)MathRound(correcton_index3[1] / 2);
Roman, avant de faire la leçon, apprends à le faire toi-même.
 
Сергей Таболин:
Roman, avant de faire la leçon, apprends par toi-même.

Puisque vous vous tournez vers la communauté pour obtenir de l'aide, personne ne va vous apprendre.
Je voulais vous aider, mais il est vraiment difficile de voir où vous avez déclaré et où vous vous êtes approprié.
Vous auriez pu au moins séparer les tableaux par blocs, pour plus de lisibilité ;)) mais peu importe, j'ai trouvé la solution.
Essayez de parcourir les boucles dans le débogueur, vous verrez où se situe le problème.

Raison: