ArrayResize

この関数は最初の次元のサイズを新しく設定します。

int  ArrayResize(
  void&  array[],              // 参照によって渡された配列
  int    new_size,            // 新しい配列サイズ
  int    reserve_size=0        // 予備サイズの値(超過)
  );

パラメータ

array[]

[out] サイズを変更する配列

new_size

[in]  最初の次元の新しいサイズ

reserve_size=0

[in]  予備を取得するための分散サイズ

戻り値

正常に実行された場合はサイズ変更後の配列に含まれる全ての要素の数を返します。それ以外の場合は、-1を返し、配列のサイズは変更されません。

ArrayResize()が静的配列、時系列または指標バッファに適応された場合、配列サイズは同じままです。これらの配列は再割り当てされません。この場合new_size<=ArraySize(array)であれば、この関数はnew_sizeのみを返します。その他の場合は -1が返されます。

注意事項

この関数は 動的配列のみに使用出来ます。SetIndexBuffer() 関数によって指標バッファとして割り当てられた動的配列のサイズは変更出来ないので注意が必要です。指標バッファについては、サイズ変更の全ての操作は端末のランタイムサブシステムによって実行されます。

配列の要素数の合計は 2,147,483,647を超えることは出来ません。

頻繁なメモリ割り当てをする場合には、物理メモリの割り当て量を減らすために予備を設定する 3 番目のパラメータを使用することをお勧めします。ArrayResize の後続の呼び出しはメモリの物理的な再配分にはつながらず、確保したメモリ内の最初の配列の次元のサイズを変更するだけです。3 番目のパラメータは物理メモリの割り当て時にのみ使用されることを忘れてはいけません。例:

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

この場合、メモリは2 回再割り当てされます。1 回目は3000要素のループに入る前(配列のサイズを1000に設定されます)で2 回目は i が 2000の時です。3 番目のパラメータを省略した場合は、メモリの物理的な再配分が2000回起こりプログラムの実行がを遅くなります。

例:

//+------------------------------------------------------------------+
//| スクリプトプログラムを開始する関数                                          |
//+------------------------------------------------------------------+
void OnStart()
 {
//---カウンタ
  ulong start=GetTickCount();
  ulong now;
  int   count=0;
//--- 迅速なバージョンのデモ配列
  double arr[];
  ArrayResize(arr,100000,100000);
//--- 予備メモリを使用したバージョンがどんなに迅速かをチェックする
  Print("--- Test Fast: ArrayResize(arr,100000,100000)");
  for(int i=1;i<=300000;i++)
    {
    //--- 100,000 予備要素を指定して新しい配列サイズを設定する。
    ArrayResize(arr,i,100000);
    //--- ラウンド数に達した時、配列のサイズとかかった時間を表示する
    if(ArraySize(arr)%100000==0)
       {
        now=GetTickCount();
        count++;
        PrintFormat("%d. ArraySize(arr)=%d Time=%d ms",count,ArraySize(arr),(now-start));
        start=now;
       }
    }
//--- 予備メモリを使用したバージョンがどんなに低速かを見る
  double slow[];
  ArrayResize(slow,100000,100000);
//---
  count=0;
  start=GetTickCount();
  Print("---- Test Slow: ArrayResize(slow,100000)");
//---
  for(int i=1;i<=300000;i++)
    {
    //--- 新しい配列サイズを設定するが予備を使用しない
    ArrayResize(slow,i);
    //--- ラウンド数に達した時、配列のサイズとかかった時間を表示する
    if(ArraySize(slow)%100000==0)
       {
        now=GetTickCount();
        count++;
        PrintFormat("%d. ArraySize(slow)=%d Time=%d ms",count,ArraySize(slow),(now-start));
        start=now;
       }
    }
 }
//--- スクリプトのサンプル結果
/*
  Test_ArrayResize (EURUSD,H1)   --- Test Fast: ArrayResize(arr,100000,100000)
  Test_ArrayResize (EURUSD,H1)   1. ArraySize(arr)=100000 Time=0 ms
  Test_ArrayResize (EURUSD,H1)   2. ArraySize(arr)=200000 Time=0 ms
  Test_ArrayResize (EURUSD,H1)   3. ArraySize(arr)=300000 Time=0 ms
  Test_ArrayResize (EURUSD,H1)   ---- Test Slow: ArrayResize(slow,100000)
  Test_ArrayResize (EURUSD,H1)   1. ArraySize(slow)=100000 Time=0 ms
  Test_ArrayResize (EURUSD,H1)   2. ArraySize(slow)=200000 Time=0 ms
  Test_ArrayResize (EURUSD,H1)   3. ArraySize(slow)=300000 Time=228511 ms
*/

参照

ArrayInitialize