Глобальные массивы: функция Count()
В прошлом выпуске я расскал о структуре хранения данных в глобальном массиве. Теперь мы знаем достаточно, чтобы начать реализовывать функции для работы с массивом:
- AddItem()
- DeleteItem()
- GetItem()
- Count()
- Search()
- BSearch
- Sort()
В каждой из вышеперечисленых функций будем использовать "критические секции". Перед каждым обращением к данным мы будем "локировать" критическую секцию с помощью вызова функции Lock(). По окончании работы с массивом "разлочим" критическую секцию с помощью функции Unlock().
Сами критические секции и функции для работы с ними подробно рассмотрены в выпуске "Критическая секция": разграничение доступа к ресурсу".
Вернемся к задуманной нами реализации глобальных массивов. Напишем функцию Count() для получения числа элементов в массиве:
//+--------------------------------------------------------------------------------------------------+
//| Функция Count() |
//| |
//| Возвращает количество элементов массива или -1 в случае ошибки |
//+--------------------------------------------------------------------------------------------------+
int Count(string array)
{
// Залокируем критическую секцию
string critical_section = array+"Lock";
if (Lock(critical_section)!=0) return(-1);
// Количество элементов массива хранится в переменной с именем,
// равным имя массива + "Count"
string gv;
gv = array+"Count";
int err;
// Если глобальная переменная не существует, то элементов нет,
// поэтому вернем 0
if (!GlobalVariableCheck(gv))
{
err = GetLastError();
if (err!=0)
{
// Разлокировать критическую секцию
Unlock(critical_section);
// Вывести сообщение об ошибке и выйти
Print("Count()->GlobalVariableCheck(): ошибка ", err);
return(-1);
}
else
{
// Разлокировать критическую секцию
Unlock(critical_section);
// Выйти
return(0);
}
}
// Глобальная переменная существует, поэтому вернем ее значение
int result;
result = GlobalVariableGet(gv);
err = GetLastError();
if (err!=0)
{
// Разлокировать критическую секцию
Unlock(critical_section);
// Вывести сообщение об ошибке и выйти
Print("Count()->GlobalVariableGet(): ошибка ", err);
return(-1);
}
// Разлокировать критическую секцию
Unlock(critical_section);
// Выйти
return(result);
}
Код этой функции крайне понятен и достаточно подробно откомментирован, поэтому я не вижу причин его разбирать более подробно. Но если у Вас появятся какие-то вопросы, то я с удовольствием на них отвечу.
В следующем выпуске я расскажу о функции AddItem().
Все статьи по теме "Пишем советников для MetaTrader 4".
- Механическая торговая система - миф или реальность?
- С чего начать при написании советника:
- Создаем нового советника - Настраиваем параметры. - Язык MetaQuotes Language 4: