MQL5参考数组函数ArrayRemove 

ArrayRemove

从指定索引开始移除数组中指定的元素数量。

bool  ArrayRemove(
   void&        array[],            // 任何类型的数组
   uint         start,              // 开始移除的索引
   uint         count=WHOLE_ARRAY   // 元素数量
   );

参数

array[]

[in][out]  数组。

start

[in]  索引,数组元素从这里开始移除。

count=WHOLE_ARRAY

[in]  移除元素的数量。WHOLE_ARRAY值表示移除从指定索引到数组结束的所有元素。

返回值

如果成功返回true,否则返回false。若要获得错误信息,请调用GetLastError()函数。可能错误:

  • 5052 – ERR_SMALL_ARRAY(start值过大),
  • 5056 – ERR_SERIES_ARRAY(该数组不能更改,指标缓冲区),
  • 4003 – ERR_INVALID_PARAMETER(count值过大),
  • 4005 - ERR_STRUCT_WITHOBJECTS_ORCLASS(包含具有析构函数的复杂对象的固定大小数组),
  • 4006 - ERR_INVALID_ARRAY (包含具有析构函数的结构或类对象的固定大小数组)。

 

注意

如果函数用于固定大小的数组,该数组大小不变:剩余的"tail"物理复制到start位置。对于准确理解函数如何工作,请参阅以下示例。"Physical(物理)"复制表示复制的对象不是通过调用构造函数或复制操作符创建的。而是复制对象的二进制表示法。为此,您不可以将ArrayRemove()函数应用于包含析构函数对象的固定大小数组 (激活ERR_INVALID_ARRAY或ERR_STRUCT_WITHOBJECTS_ORCLASS错误)。当在移除这种对象时,应该调用两次析构函数 – 针对原始对象及其副本。

您不能从由SetIndexBuffer()函数指定为指标缓冲区的动态数组移除元素。这会导致ERR_SERIES_ARRAY错误。对于指标缓冲区,所有更改大小的操作都通过程序端的执行子系统来完成。

例如:

//+------------------------------------------------------------------+
//| 脚本程序起始函数                                                   |
//+------------------------------------------------------------------+
void OnStart()
  {
//--- 声明固定大小数组并填充值
   int array[10];
   for(int i=0;i<10;i++)
     {
      array[i]=i;
     }
//--- 在移除元素之前显示数组
   Print("Before calling ArrayRemove()");
   ArrayPrint(array);
//--- 从数组中删除2个元素并显示新集合
   ArrayRemove(array,4,2);
   Print("After calling ArrayRemove()");
   ArrayPrint(array);
/*
  执行结果:
  Before calling ArrayRemove()
   0 1 2 3 4 5 6 7 8 9
  After calling ArrayRemove()
   0 1 2 3 6 7 8 9 8 9
*/

另见

ArrayInsert ArrayCopyArrayResizeArrayFree