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() 기능을 통해 지표 버퍼로 할당된 동적 배열의 크기는 변경할 수 없습니다. 지표 버퍼의 경우 크기 조정 작업은 모두 터미널의 런타임 하위 시스템에 의해 수행됩니다.

배열의 총 요소의 양은 2147483647을 초과할 수 없습니다.

메모리를 자주 할당할 경우 물리적 메모리 할당 수를 줄이려면 예약을 설정하는 세 번 째 변수를 사용하는 것이 좋습니다. 이후의 모든 ArrayResize 호출은 메모리를 물리적으로 재할당하지 않고 예약된 메모리 내에서 첫 번째 배열 차원의 크기만 변경합니다. 세 번째 매개변수는 물리적 메모리를 할당하는 동안에만 사용됩니다. 예를 들어:

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

이 경우, 메모리가 두 번 재할당되며, 첫 번째는 3000회 반복 루프(배열의 크기가 1000으로 설정됨)에 들어가기 전에 i를 사용하는 두 번째는 2000과 같습니다. 세 번째 매개변수를 건너뛰면 2000 개의 물리적 메모리 재할당이 발행하여 프로그램 속도가 느려집니다.

예:

//+------------------------------------------------------------------+
//| 스크립트 프로그램 시작 기능                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//--- 카운터
   ulong start=GetTickCount();
   ulong now;
   int   count=0;
//--- 빠른 버전의 데모를 위한 배열
   double arr[];
   ArrayResize(arr,100000,100000);
//--- 메모리 예약이 있는 모델이 얼마나 빨리 작동하는지 확인
   Print("--- 빠른 테스트: 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("---- 느린 테스트: 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