Глобальные массивы: функция 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: