CArrayObj

Класс CArrayObj является классом динамического массива указателей на экземпляры класса CObject и его наследников.

Описание

Класс CArrayObj обеспечивает возможность работы с динамическим массивом указателей на экземпляры класса CObject и его наследников. Это дает возможность работы как с многомерными динамическими массивами примитивных типов данных, так и с более сложно организованными структурами данных.

В классе реализованы возможности добавления/вставки/удаления элементов массива, сортировки массива, поисков в сортированном массиве. Кроме того, реализованы методы работы с файлом.

Существуют определенные тонкости работы с классом CArrayObj.

Декларация

   class CArrayObj : public CArray

Заголовок

   #include <Arrays\ArrayObj.mqh>

Иерархия наследования

  CObject

      CArray

          CArrayObj

Прямые потомки

CIndicators, CSeries

Методы класса по группам

Атрибуты

 

FreeMode

Получает флаг управления памятью

FreeMode

Устанавливает флаг управления памятью

Управление памятью

 

Reserve

Резервирует память для увеличения размеров массива

Resize

Устанавливает новый (меньший) размер массива

Shutdown

Очищает массив с полным освобождением памяти массива (но не элементов).

Создание нового элемента

 

virtual CreateElement

Создает новый элемент массива в указанной позиции.

Наполнение

 

Add

Добавляет элемент в конец массива

AddArray

Добавляет в конец массива элементы из другого массива

Insert

Вставляет элемент в массив в указанную позицию

InsertArray

Вставляет в массив элементы из другого массива с указанной позиции

AssignArray

Копирует в массив элементы из другого массива

Изменение

 

Update

Изменяет элемент в указанной позиции массива

Shift

Перемещает элемент из указанной позиции массива на указанное смещение

Удаление

 

Detach

Получает элемент из указанной позиции с удалением его из массива

Delete

Удаляет элемент из указанной позиции массива

DeleteRange

Удаляет группу элементов из указанной позиции массива

Clear

Удаляет все элементы массива без освобождения памяти массива

Доступ

 

At

Получает элемент из указанной позиции массива

Сравнение

 

CompareArray

Сравнивает массив с другим массивом

Операции с сортированным массивом

 

InsertSort

Вставляет элемент в сортированный массив

Search

Ищет элемент равный образцу в сортированном массиве

SearchGreat

Ищет элемент больше образца в сортированном массиве

SearchLess

Ищет элемент меньше образца в сортированном массиве

SearchGreatOrEqual

Ищет элемент больше или равный образцу в сортированном массиве

SearchLessOrEqual

Ищет элемент меньше или равный образцу в сортированном массиве

SearchFirst

Ищет первый элемент равный образцу в сортированном массиве

SearchLast

Ищет последний элемент равный образцу в сортированном массиве

Ввод/вывод

 

virtual Save

Сохраняет данные массива в файле

virtual Load

Загружает данные массива из файла

virtual Type

Получает идентификатор типа массива

Методы унаследованные от CObject

Prev, Prev, Next, Next, Compare

Методы унаследованные от CArray

Step, Step, Total, Available, Max, IsSorted, SortMode, Clear, Sort

Практическое применение имеют массивы потомков класса CObject (в том числе все классы стандартной библиотеки).

Для примера рассмотрим вариант реализации двухмерного массива:

#include <Arrays\ArrayDouble.mqh>
#include <Arrays\ArrayObj.mqh>
//---
void OnStart()
  {
   int i,j;
   int first_size=10;
   int second_size=100;
//--- create array
   CArrayObj    *array=new CArrayObj;
   CArrayDouble *sub_array;
//---
   if(array==NULL)
     {
      printf("Object create error");
      return;
     }
//--- create subarrays
   for(i=0;i<first_size;i++)
     {
      sub_array=new CArrayDouble;
      if(sub_array==NULL)
        {
         delete array;
         printf("Object create error");
         return;
        }
      //--- fill array
      for(j=0;j<second_size;j++)
        {
         sub_array.Add(i*j);
        }
      array.Add(sub_array);
     }
//--- create array OK
   for(i=0;i<first_size;i++)
     {
      sub_array=array.At(i);
      for(j=0;j<second_size;j++)
        {
         double element=sub_array.At(j);
         //--- use array element
        }
     }
   delete array;
  }

 
Тонкости работы

В классе реализован механизм управления динамической памятью, поэтому нужно быть очень внимательным при работе с элементами массива.

Механизм управления памятью можно включать/отключать при помощи метода FreeMode(bool). По умолчанию механизм включен.

Соответственно, есть два варианта работы с классом CArrayObj:

1. Механизм управления памятью включен. (по умолчанию)

В этом случае, CArrayObj берет на себя ответственность за освобождение памяти элементов после их удаления из массива. При этом программа пользователя не должна освобождать элементы массива.

Пример использования:

   int i;
//--- создаем массив
   CArrayObj *array=new CArrayObj;
//--- наполняем массив элементами
   for(i=0;i<10;i++) array.Add(new CObject);
//--- что-то делаем
   for(i=0;i<array.Total();i++)
     {
      CObject *object=array.At(i);
      //--- действия с элементом
      . . .
     }
//--- удаляем массив вместе с элементами
   delete array;

2. Механизм управления памятью выключен.

В этом случае, CArrayObj не отвечает за освобождение памяти элементов после их удаления из массива. При этом программа пользователя должна освобождать элементы массива.

Пример использования:

   int i;
//--- создаем массив
   CArrayObj *array=new CArrayObj;
//--- выключаем механизм управления памятью
   array.FreeMode(false);
//--- наполняем массив элементами
   for(i=0;i<10;i++) array.Add(new CObject);
//--- что-то делаем
   for(i=0;i<array.Total();i++)
     {
      CObject *object=array.At(i);
      //--- действия с элементом
      . . .
     }
//--- удаляем элементы массива
   while(array.Total()) delete array.Detach();
//--- удаляем пустой массив
   delete array;