« Предыдущий пост | На главную страницу | Следующий пост »

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

« Предыдущий пост | На главную страницу | Следующий пост »

Подписаться на мою рассылку



Размещение статьи "Глобальные массивы: функция DeleteItem()" на Вашем сайте

Размещение статьи "Глобальные массивы: функция DeleteItem()" на Вашем сайте возможно при условии выполнениия следующих условий:

  • Запрещается изменение оригинального текста без согласия автора - Андрея Ведихина.
  • Должен быть указан первоисточник. В случае публикации в интернете Вы должны разместить следующий код гиперссылки без изменений:
  • Запрещается коммерческое использование материалов, взятых с блога "Интернет-трейдинг на форекс / forex". Доступ к ним должен быть свободным, без взимания какой-либо платы, без обязательной регистрации и/или заполнения опросного листа (анкеты) и т.д.

В случае выполнения данных условий не требуется согласия автора блога "Интернет-трейдинг на форекс / forex" на размещение статьи "Глобальные массивы: функция DeleteItem()" на Вашем сайте.

Журнал FOREX MAGAZINE:



Архив номеров FOREX MAGAZINE
Котировки Forex:

Счетчики:

Авторские права © 2005-2006 Андрей Ведихин

Условия использования материалов блога "Интернет-трейдинг на форекс / forex"

Контакты с автором:


Движок сайта:
Movable Type 5.04