Глобальные массивы: функция AddItem()
В этомы выпуске я опишу функцию AddItem(), которую мы будем использовать для добавления нового элемента в массив.
Вот ее исходный код:
//+--------------------------------------------------------------------------------------------------------+ //| Функция AddItem() | //| | //| Добавляет элемент в массив. Возвращает новое количество элементов| //| в случае успешного добавления и -1 - в случае ошибки | //| | //| Параметры: | //| array - имя массива | //| item - новый элемент массива | //| is_sorted - флаг отсортированности массива (может быть изменен | //| в процессе выполнения функции, если возникнут | //| ошибки при сортировке) | //+--------------------------------------------------------------------------------------------------------+ int AddItem(string array, double item, bool &is_sorted) { // Залокировать критическую секцию string critical_section = array+"Lock"; if (Lock(critical_section)!=0) return(-1);
// Количество элементов массива хранится в переменной с именем, // равным имя массива + "Count" string gv_count; gv_count = array+"Count";
int count, err;
// Если глобальная переменная не существует, то элементов нет if (!GlobalVariableCheck(gv_count)) { err = GetLastError(); if (err!=0) { // Разлокировать критическую секцию Unlock(critical_section);
// Вывести сообщение об ошибке и выйти Print("AddItem()->GlobalVariableCheck(): ошибка ", err); return(-1); } else count = 0; } else // переменная существует, получим количество элементов count = GlobalVariableGet(gv_count);
// Увеличим число элементов массива count = count + 1;
// добавим в массив элемент if (GlobalVariableSet(array+DoubleToStr(count, 0),item)==0) { // произошла ошибка при добавлении элемента
// Разлокировать критическую секцию Unlock(critical_section);
// Вывести сообщение об ошибке и выйти Print("AddItem()->GlobalVariableSet(item): ошибка ", GetLastError()); return(-1); }
// запишем новое число элементов в массиве if (GlobalVariableSet(gv_count,count)==0) { // произошла ошибка при изменении числа элементов
// Разлокировать критическую секцию Unlock(critical_section);
// Вывести сообщение об ошибке и выйти Print("AddItem()->GlobalVariableSet(count): ошибка ", GetLastError()); return(-1); }
// массив сортированный? if (is_sorted) { // да, поэтому отсортируем массив int i; for (i=count; i>1; i--) { double cur_item = GlobalVariableGet(array+DoubleToStr(i, 0)); double prev_item = GlobalVariableGet(array+DoubleToStr(i-1, 0)); if (cur_item>prev_item) break; // поменять элементы местами if (GlobalVariableSet(array+DoubleToStr(i, 0),prev_item)==0) { is_sorted = false; break; } if (GlobalVariableSet(array+DoubleToStr(i-1, 0),cur_item)==0) { is_sorted = false; // пытаемся вернуть перезаписанный текущий элемент в первоначальное // состояние if (GlobalVariableSet(array+DoubleToStr(i, 0),cur_item)==0) { Print("AddItem()->GlobalVariableSet: данные безвозвратно испорчены");
// Разлокировать критическую секцию Unlock(critical_section);
return(-1); } break; } } }
// Разлокировать критическую секцию Unlock(critical_section);
return(count); }
Думаю, что у Вас не возникло проблем с пониманием этой функции. Возможно, что единственным непонятным местом может быть сортировка массива после вставки нового элемента. В этом случае мы просто "опускаем" новый элемент до тех пор, пока он не встанет на свое место:
// массив сортированный? if (is_sorted) { // да, поэтому отсортируем массив int i; for (i=count; i>1; i--) { double cur_item = GlobalVariableGet(array+DoubleToStr(i, 0)); double prev_item = GlobalVariableGet(array+DoubleToStr(i-1, 0)); if (cur_item>prev_item) break; // поменять элементы местами if (GlobalVariableSet(array+DoubleToStr(i, 0),prev_item)==0) { is_sorted = false; break; } if (GlobalVariableSet(array+DoubleToStr(i-1, 0),cur_item)==0) { is_sorted = false; // пытаемся вернуть перезаписанный текущий элемент в первоначальное // состояние if (GlobalVariableSet(array+DoubleToStr(i, 0),cur_item)==0) { Print("AddItem()->GlobalVariableSet: данные безвозвратно испорчены");
// Разлокировать критическую секцию Unlock(critical_section);
return(-1); } break; } } }
Сортировку массива после добавления нового элемента мы производим только в том случае, если массив уже до этого был отсортирован, т.е. флаг is_sorted был равен true.
Если во время сортировки мы столкнулись с критической ошибкой (данные массива были испорчены), то мы выйдем с кодом -1. А если ошибка была некритическая (т.е. данные испорчены не были, но сортировка была прервана), то мы изменим значение флага is_sorted на false.
В следующем выпуске я расскажу о функции поиска в массиве.
Все статьи по теме "Пишем советников для MetaTrader 4".
- Механическая торговая система - миф или реальность?
- С чего начать при написании советника:
- Создаем нового советника - Настраиваем параметры. - Язык MetaQuotes Language 4:
Комментарии по теме "Глобальные массивы: функция AddItem()"
Андрюша привет!
Я рад твоему продвижению вперёд,тем более,что у меня прекрасные вепчатления осталысь от общения с тобой в Москве на Форекс-експо в Радисон Славянская в прошлом году в Марте!
Очень ценью что ты так образованный человек и трудишься!
Прошу елси тебя не затруднит,войды в контакт со мной по АСКЕ 157358993,буду рад пообщатся и есть что сказать
Это Мераб из Харькова
Спасибо за вниманые!
Автор: Merab | 21.12.2006 17:24
Спасибо за комментарий.
Если честно, то практически перестал использовать аську для общения. Мой емейл все тот же.
Рабочий телефон: +44 20 7648 4560 (но возьмут трубку вначале англоговорящие сотрудники).
Автор: Андрей Ведихин | 26.12.2006 18:29