MQL4、MQL5に関する初心者からの質問、アルゴリズムやコードに関するヘルプ、ディスカッションなど。 - ページ 1005

 
その仕組みはこうだ。
 
Seric29:
その仕組みはこうだ。
イリヤスはすでにかなり明確に説明している。彼の投稿の中から探してみてください。
 
Seric29:
その仕組みはこうだ。

ドキュメントに書かれていることはすべて読みましたか?こんなのまで読んでるんですね。

備考

この関数は動的配列にのみ適用可能である。 SetIndexBuffer()関数でインジケータバッファとして割り当てられた動的配列は、サイズ変更できないことに留意する必要があります。インジケータ・バッファのサイズ変更に関するすべての操作は、端末のエグゼクティブ・サブシステムによって実行される。

配列の要素数の合計が2147483647を超えることはできません。

頻繁にメモリが割り当てられる場合は、リザーブを指定する第3パラメータを使用して、物理メモリの割り当て量を減らすことが推奨されます。そ 以降の ArrayResize関数の呼び出しでは 物理メモリの再割り当ては行われず、予約メモリ内の配列の1次元目のサイズが変更されるだけ です。 第3パラメータは、例えば物理メモリの割り当てが進行中の場合にのみ使用されることに留意してください。

ArrayResize(arr,1000,1000);
for(int i=1;i<3000;i++)
ArrayResize(arr,i,1000)。

この場合、2回のメモリ再割り当てが 行われます。1回目は配列の次元を1000に設定し、3000回反復するループに入る前、2回目はiが2000に等しくなったときです。第3パラメータを省略した場合、物理メモリの再割り当てが2,000 回発生し、プログラムの実行速度が低下します。


何がはっきりしないのか?

 
Alexey Viktorov:

ドキュメントに書かれていることはすべて読みましたか?これでも読んでください。

何がはっきりしないんだ?

まあ、そこは写真も例もなく、これらの再配布の意味や使い方は、説明がなければ100%開発者の考えで推測できるわけで、その点では安心です。ここに書かれている3行から判断すると、ArrayResize(arr,1000,1000); で2000要素の配列が作成されていると思われます。でも、ここがはっきりしないんです。例えばArrayResize(arr,1,1000); を実行すると、配列が1000になるまで1000はハングアップしてしまうのです。

for(int i=1;i<1001;i++)ArrayResize(массив,i,1000);

または、プログラムはオーバークロックの前にこのフラグメントを使用し、カウンターをインクリメントするだけです。あるいは、この1000はCPUから素早くメモリを取得するために転がっているだけで、もしそうならバックアップメモリも転送する必要があり、それならバックアップがない方が作業がしやすいのです。一般的に、コードなし、情報なし、写真なし、どう動くかわからない。

 
このように、何らかのSystemクラスによってハードディスクに100%負荷がかかっている状態(10kaの場合)はないのでしょうか?アルプス端子でも起こる...。通常、端末はテスト時にディスクを読み込むのですが、ここではカッブダだけ...。3〜5秒と長くないが、具体的
 
Yevhenii Levchenko:
ハードディスクが100%何らかのSystem classを起動している(10で)こんなことはありませんか?アルプス端子でも起こる...。通常、端末はテスト時にディスクを読み込むのですが、ここではカッブダだけ...。3〜5秒と長くないが、具体的

が発生するが、PC再起動後

PC再起動後10-15分でWindows Defenderが「ディスクをかみ砕き」、PCの使用統計が収集されます。

解決策 - PCをサスペンドする。私のPCは1ヶ月間再起動せずに使える。PCをシャットダウンする代わりに、キーボードのスリープボタンを押す。何度か電源が落ちたが、PCがスリープ状態であれば、Win10の起動に問題はない。

 
Seric29:

それが、写真も例もなく、これらの再配布の意味も、説明されていなければ100%開発者の考えに沿って使い方が推測できるのです。 ここに書かれている3行から判断 すると、ArrayResize(arr,1000,1000); で2000要素の配列が作成されていると思われます。でも、ここがはっきりしないんです。例えばArrayResize(arr,1,1000); を実行すると、配列が1000になるまで1000はハングアップしてしまいます。

または、プログラムはオーバークロックの前にこのフラグメントを使用し、カウンターをインクリメントするだけです。あるいは、この1000はCPUから素早くメモリを取得するために転がっているだけで、もしそうならバックアップメモリも転送する必要があり、それならバックアップがない方が作業がしやすいのです。一般的に、コードなし、情報なし、写真なし、どう動くかわからない。

3行のコードだけでなく、すべてを分かりやすく説明しているテキストも読んでみてください。

リザーブドメモリとアレイサイズは異なる概念です。ArrayResize(arr,1000,1000) で配列サイズをオーバーライドすると、 配列の 最後の要素は999になり、それ以上にはなりません。しかし、アレイのサイズを大きくする必要がある場合、メモリの再割り当ては行われません。このような配列サイズの確保が必要ない場合は、小さくするか、全く確保しないようにします。

 

こんにちは。
関数 内に1つのパラメータを配列として 配置したい。 どうやったらうまくできるのかがわからない。例を訂正してもらえますか?

void OnTick()
  {
//---
   int TestArr[]= {5,3,9,4};
   TestFArr(TestArr[]);
  }
//+------------------------------------------------------------------+

void TestFArr(int TestArr[])
  {
   int size=ArraySize(TestArr);
   Print(" --------------- size: ",size);
  }
//+------------------------------------------------------------------+
 
Nauris Zukas:

こんにちは。
関数 内に1つのパラメータを配列として 配置したい。どうやったらうまくできるのかがわからない。例を訂正してもらえますか?

void OnTick()
  {
//---
   int TestArr[]= {5,3,9,4};
   TestFArr(TestArr);
  }
//+------------------------------------------------------------------+

void TestFArr(int & TestArr[])
  {
   int size=ArraySize(TestArr);
   Print(" --------------- size: ",size);
  }
//+------------------------------------------------------------------+
 
Artyom Trishkin:

ありがとうございました。