ArrayResize

函数建立新的第一维大小

int  ArrayResize(
   void&  array[],              // 引用传递的数组
   int    new_size,             // 新数组大小
   int    reserve_size=0        // 保留尺寸值 (过量)
   );

参量

array[]

[out] 数组变化尺寸

new_size

[in]  第一维度新尺寸

reserve_size=0

[in]  获得存储的分散式大小

返回值

如果执行成功,在数组中改变规格后返回所有元素计数,否则,返回-1,数组不调整大小。

如果ArrayResize() 应用于静态数组,timeseries指标缓冲区,数组大小保持一致 –这些数组将不会被重新分配。在这种情况下,如果new_size<=ArraySize(数组),函数将只会返回 new_size;否则将会返回-1值。

注释

该函数只能应用在 动态数组。应该注意的是您不能改变通过SetIndexBuffer()函数分配的作为指标缓冲区的动态数组的大小。对于指标缓冲区,调整大小的所有操作都通过程序端的运行时间子系统来执行。

数组中的元素总数不能超过 2147483647。

随着频繁的内存分配,推荐使用设置存储以减少物理内存分配数量的第三方参数。后来的ArrayResize所有调用都不能导致重新分配物理内存,只是会在保留内存内改变第一数组维度的大小。应谨记,第三方参数只能在物理内存分配期间使用。例如:

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

假若这样,内存将被重新分配两次,第一次是输入2000元素循环之前(数组大小将设为1000),第二次是i等于3000.如果我们跳过第三方参数,将会有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