エラー、バグ、質問 - ページ 2493

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

どこを掘るの?

待つ必要がある - キュービクルは混雑している(連絡時にデータは集計されていない)

 
このトピックに関係のないコメントは、「MQL5 MT5 MetaTrader5初心者からの質問」に移動しました。
 
このトピックに関係のないコメントは、「MQL5 MT5 MetaTrader5初心者からの質問」に移動しました。
 

エラー発生

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

以下は、コードそのものです。

//+-------------------
   // коррекция
   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);

i=6のとき,correcton_index7[i+2](i+2=8) は配列の限界を超えては いけない.前のループでは同じ エラーは出なかったからなおさらだ。何を見落としているのだろう?

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

エラー発生

以下は、コードそのものです。

i=6のとき,correcton_index7[i+2](i+2=8) は配列の 限界を超えることはできない.前のループでは同じ エラーは出なかったからなおさらだ。何を見落としているのだろう?

correcton3[3];では、3つの項目を指定しています。
そして、ループは4回呼び出さ
れます。

correcton7[
7]では、7つの要素を指定しています。
そして、ループを8回実行
します。

 
Roman:

correcton3[3];では、3つの要素を指定 します。
そして、そのループを4回実行するのです。


correcton7[
7 ]では 7つの要素を指定して います。
そして、そのループを8回実行するのです。

指で数えてみよう。i=0で、ループするたびに1ずつ増えていく。i<7まで動作する。あなたへの質問(指で数えてください)は、このループが何回実行されるかです。

 
はい、すみません、条件にループがないことを見抜けませんでした =。

問題ないでしょうか?
correcton_index[0]   = 1;
correcton_index3[0]  = 1;  
 correcton_index7[0]  = 1;
0個の要素を指定し、そこに値を割り当てる。
 
Roman:
はい、申し訳ありませんが、サイクルの条件では見ませんでした=。

問題ないでしょうか?
0個の要素を指定し、そこに値を割り当てる。

ご協力ありがとうございます!まずは自分でアレイを整理してみましょう。)))

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

ご協力ありがとうございます!まずは自分でアレイを整理してみましょう。)))

配列の宣言と配列の要素 に対する反復は異なる )))

 
Roman:

配列の宣言と配列の要素 に対する反復は異なる ))

   int      correcton_index7[9];        // объявление
            correcton_index7[0]  = 1;   // присвоение значения
            correcton_index7[1]  = (int)MathRound(correcton_index3[1] / 2);
ローマン、講義する前に、自分でやり方を覚えろ。