最適化中の単一アレイ計算 - ページ 6

 
Alexey Viktorov:

以下は、配列の書き込みと読み出しの例です。

デバッグモードで2回実行し、配列の書き込みと読み出しにかかる時間を確認します。最初の実行では配列をファイルに書き込み、2回目の実行ではそれを読み込んで配列から日付の印字を開始します。そして、ハイライトされた部分、IS_DEBUG_MODEを 削除するかどうか、IsOptimization()を条件に挿入するかどうかを判断してください。

ありがとうございます。
 
Dmitry Fedoseev:

FileWriteInteger()のような関数があります。位置で識別する場合、変数はファイルの先頭になければならず、それを読んだ後、ポインタはその末尾、つまり配列の先頭に移動し、配列を読んだ後、ポインタは次の変数の前にある...。

ファイルを使った作業に関する記事は、近日中に公開予定です。

ファイル操作の記事がないことを書きたかったのです。このような、情報量が多く、かつ明快な文章を書かれるのであれば、必ず読ませていただきます。

 

グローバルレベルで配列を宣言して みた(mql4コード)

datetime T[];

イニテに記入する

ArrayResize(T,40);
datetime T[40]=
   {
   1262731020,1262735700,1262821920,1262903400,1262989740,1263247200,1263339060,1263420000,1263507480,1263595500,
   1265324700,1265407200,1265752980,1265926500,1265930820,1267657200,1267740300,1267826460,1268175840,1268346360,
   1270504920,1270684140,1270768500,1272924180,1273011720,1273097100,1273272240,1273528800,1273617180,1275344100,
   1275516000,1275602400,1275689160,1276034400,1276124580,1276208700,1276211640,1278027960,1278369780,1278373920
   };

開始時に設定されていない場合、1971年の日付を表示する、つまり配列は空である

for (int x=0;x<=39;x++)
   {
   Print("T[x]=",T[x],"x=",x);   
   }

スタートで配列を埋めていくと、値が表示される。配列がデータタイムに再初期化されるのが原因かもしれませんが、それがないとコンパイルできないのでしょうか?

アレイが消える。何がいけなかったのか?

 
forexman77:

グローバルレベルで配列を宣言して みた(mql4コード)

イニテに記入する

開始時に設定されていない場合、1971年の日付を表示する、つまり配列は空である

スタートで配列を埋めていくと、値が表示される。配列がデータタイムに再初期化されるのが原因かもしれませんが、それがないとコンパイルできないのでしょうか?

アレイが消える。何がいけなかったのか?

コンパイラが言っていることを見てください。

ArrayResize(T,40);
datetime T[40]=

このような簡単な動きで、OnInitの終了時に消滅するローカル配列Tを定義したことになる...。

 
Maxim Kuznetsov:

は、コンパイラが生成する警告を確認してください。

こんな簡単な動きで、OnInitを抜けると消えてしまうローカル配列Tを定義してしまった...。

すでにグローバル宣言があるとのこと)

T' の宣言が 40 行目にあるグローバル宣言を隠す

でも、どうすればいいのか。今まで中括弧を使って配列を宣言 したことはなかった。0で初期化してサイズを設定し、ループで埋めました。何か他の方法はないのでしょうか?

initeのdatetimeをクリアすると、コードはコンパイルされず、2つのエラーが書き込まれます。

'{' - 式が予想されます。

'=' - 不正な操作の使用



 
forexman77:

すでにグローバル宣言があるとのこと)

T' の宣言が 40 行目にあるグローバル宣言を隠す

でも、どうすればいいのか。今まで中括弧を使って配列を宣言 したことはなかった。0で初期化してサイズを設定し、ループで埋めました。何か他の方法はないのでしょうか?

initeのdatetimeをクリアすると、コードはコンパイルされず、2つのエラーが書き込まれます。

'{' - 式が予想されます。

'=' - 不正な操作の使用



配列の宣言と定数の初期化は、グローバルレベルで行うことができる(はずである)。

datetime T[40]=
   {
   1262731020,1262735700,1262821920,1262903400,1262989740,1263247200,1263339060,1263420000,1263507480,1263595500,
   1265324700,1265407200,1265752980,1265926500,1265930820,1267657200,1267740300,1267826460,1268175840,1268346360,
   1270504920,1270684140,1270768500,1272924180,1273011720,1273097100,1273272240,1273528800,1273617180,1275344100,
   1275516000,1275602400,1275689160,1276034400,1276124580,1276208700,1276211640,1278027960,1278369780,1278373920
   };
void OnInit() 
{
 ....
}
 
forexman77:

すでにグローバル宣言があるとのこと)

T' の宣言が 40 行目にあるグローバル宣言を隠す

でも、どうすればいいのか。今まで中括弧を使って配列を宣言 したことはなかった。0で初期化してサイズを設定し、ループで埋めました。何か他の方法はないのでしょうか?

initeのdatetimeをクリアすると、コードはコンパイルされず、2つのエラーが書き込まれます。

'{' - 式が予想されます。

'=' - 不正な操作の使用



配列の宣言時にのみ、'='で配列を初期化することができます。Cの名残のようですが、こちらではそうなっています :-)
 
Maxim Kuznetsov:

配列の宣言と定数の初期化は、グローバルレベルで行うことができた(はずである)。

はい、試してみましたが、うまくいきました。しかもグローバルレベルでないとできない、計算量を減らすためにやっただけ、initで一度配列を埋めて、その配列の値を使う?

論理的には、グローバルレベルの変数は常に一定なので、プログラムの最初に一度だけ計算を行うことになりますが?

 
forexman77:

はい、試してみましたが、うまくいきました。しかもグローバルレベルでないとできない、計算量を減らすためにやっただけ、initで一度配列を埋めて、その配列の値を使う?

論理的にはグローバルレベルの変数は常に一定なので、プログラムの最初に一度だけ計算が行われるのですが?

はい、ex4 ex5 バイナリをターミナルで実行するために準備する場合。記述されたデータ配列にリンクしているだけ(コンパイル時にex4/5内部に保存されている)と考えることができ、非常に高速です...。
 
forexman77:

すでにグローバル宣言があるとのこと)

T' の宣言が 40 行目にあるグローバル宣言を隠す

でも、どうすればいいのか。今まで中括弧を使って配列を宣言 したことはなかった。0で初期化してサイズを設定し、ループで埋めました。何か他の方法はないのでしょうか?

initeのdatetimeをクリアすると、コードはコンパイルされず、2つのエラーが書き込まれます。

'{' - 式が予想されます。

'=' - 不正な操作の使用



配列がどのように満たされるかは、あまり重要ではありません。配列のサイズが0であれば、評価、充填、ファイルへの書き込みを行うという条件を設定するだけでよい。そして、OnInit()で、私の例を使って宣言された配列に読み込んでみてください。したがって、ファイル配列があり、それを読み込んで配列を埋めても、再計算して配列を埋めることはありません。