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  (массив фиксированного размера, который содержит объекты структур или классов с деструктором).

 

Примечание

Если функция используется для массива фиксированного размера, то сам размер массива не меняется: при этом происходит физическое копирование оставшегося "хвоста" в позицию start. Для точного понимания работы функции смотрите пример ниже. "Физическое" копирование означает, что копируемые объекты не создаются с помощью вызова конструктора или оператора копирования, а просто происходит копирование бинарного представления объекта. Именно по этой причине запрещается применять функцию ArrayRemove() к массиву фиксированного размера, содержащего объекты с деструктором (взводится ошибка ERR_INVALID_ARRAY или ERR_STRUCT_WITHOBJECTS_ORCLASS). Так как при удалении такого объекта деструктор должен быть вызван дважды – для первоначального объекта и его копии.

Нельзя удалять элементы из динамических массивов, назначенных в качестве индикаторных буферов функцией SetIndexBuffer(), это приведет к появлению ошибки ERR_SERIES_ARRAY. Для индикаторных буферов все операции по изменению размера производит исполняющая подсистема терминала.

Пример:

//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//--- объявим массив фиксированного размера и заполним значениями
   int array[10];
   for(int i=0;i<10;i++)
     {
      array[i]=i;
     }
//--- покажем массив до удаления элементов
   Print("До вызова ArrayRemove()");
   ArrayPrint(array);
//--- удалим 2 элемента из массива и покажем новый состав
   ArrayRemove(array,4,2);
   Print("После вызова ArrayRemove()");
   ArrayPrint(array);
/*
   Результат выполнения: 
   До вызова ArrayRemove()
   0 1 2 3 4 5 6 7 8 9
   После вызова ArrayRemove()
   0 1 2 3 6 7 8 9 8 9
*/

Смотри также

ArrayInsert, ArrayCopy, ArrayResize, ArrayFree