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