Глобальные массивы: функция DeleteItem()
В этом выпуске я расскажу о функции DeleteItem(), с помощью которой Вы сможете удалить элемент с индексом index из массива array:
bool DeleteItem(string array, int index, bool &is_sorted)
Функция возвращает true в случае успешного удаления и false - в случае ошибки.
Исходный код функции:
//+---------------------------------------------------------------------------------------------------+ //| Функция DeleteItem() - удаляет элемент из массива | //| | //| Возвращает true, если не было ошибки, и false, если ошибка была | //| | //| Параметры: | //| array - имя массива | //| index - индекс элемента | //| is_sorted - флаг отсортированности массива (может быть изменен | //| в процессе выполнения функции, если возникнут | //| ошибки при сортировке) | //+---------------------------------------------------------------------------------------------------+ bool DeleteItem(string array, int index, bool &is_sorted) { // Залокируем критическую секцию string critical_section = array+"Lock"; if (Lock(critical_section)!=0) return(false);
// Количество элементов массива хранится в переменной с именем, // равным имя массива + "Count" string gv_count; gv_count = array+"Count";
int count, err;
// Если глобальная переменная не существует, то элементов нет if (!GlobalVariableCheck(gv_count)) { err = GetLastError(); if (err!=0) { // Разлокировать критическую секцию Unlock(critical_section);
// Вывести сообщение об ошибке и выйти Print("DeleteItem()->GlobalVariableCheck(): ошибка ", err); return(false); } else count = 0; } else // переменная существует, получим количество элементов count = GlobalVariableGet(gv_count);
// Проверяем входной параметр на вхождение в допустимый диапазон if ((index<1)||(index>count)) { // Разлокировать критическую секцию Unlock(critical_section);
Print("DeleteItem(): значение входного параметра index (", index, ") не находится в допустимом диапазоне (1..", count,")"); return(false); }
// если массив не сортированный, то просто поставим на место // удаляемого элемента самый последний if (!is_sorted) { // если элемент и так последний, то можно не переставлять if (index!=count) { double last_item = GlobalVariableGet(array+DoubleToStr(count, 0)); if (GlobalVariableSet(array+DoubleToStr(index, 0),last_item)==0) { // произошла ошибка
// Разлокировать критическую секцию Unlock(critical_section);
// Вывести сообщение об ошибке и выйти Print("DeleteItem()->GlobalVariableSet(item): ошибка ", GetLastError()); return(false); } } } // если массив неотсортированный else { // перенесем все последующие элементы ближе к началу for (int i = index; i<count; i++) { double next_item = GlobalVariableGet(array+DoubleToStr(i+1, 0)); if (GlobalVariableSet(array+DoubleToStr(i, 0),next_item)==0) { // произошла ошибка
// Разлокировать критическую секцию Unlock(critical_section);
// Вывести сообщение об ошибке и выйти Print("DeleteItem()->GlobalVariableSet(item): ошибка ", GetLastError()); return(false); } } }
// уменьшим число элементов в массиве count = count - 1; if (GlobalVariableSet(gv_count,count)==0) { // произошла ошибка при изменении числа элементов
// Разлокировать критическую секцию Unlock(critical_section);
// Вывести сообщение об ошибке и выйти Print("DeleteItem()->GlobalVariableSet(count): ошибка ", GetLastError()); return(false); } // раз дошли до этой строчки, то элемент удален без ошибки
// Разлокировать критическую секцию Unlock(critical_section);
return(true); }
Как видно из комментариев, эта функция выполняет следующие действия:
- Локирует критическую секцию, чтобы исключить одновременный доступ к массиву из нескольких потоков.
- Получает в переменную count количество элементов в массиве.
- Убеждается, что index находится в диапазоне 1..count.
- Если массив неотсортированный, то вместо удаленного элемента сохраняет последний элемент в массиве. Если массив отсортированный, то переносит все элементы после удаленного на 1 позицию ближе к началу.
- Уменьшает число элементов в массиве.
- Разлокирует критическую секцию.
Если в процессе выполнения функции встречаются ошибки, то критическая секция разлокируется и возвращается значение false.
Все статьи по теме "Пишем советников для MetaTrader 4".
- Механическая торговая система - миф или реальность?
- С чего начать при написании советника:
- Создаем нового советника - Настраиваем параметры. - Язык MetaQuotes Language 4: