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