Глобальные массивы: функция GetItem()
Очень полезной функцией для работы с глобальным массивом может стать функция GetItem():
bool GetItem(string array, int index, double &result)
Эта функция пытается получить значение элемента с индексом index и вернуть это значение через переменную result в переменную, указанную в качестве третьего параметра при вызове этой функции.
Параметры:
- array - имя массива
- index - индекс элемента
- result - элемент массива с индексом index
В случае возникновения ошибки функция GetItem() возвращает false. Если ошибки не было, то - true.
Обратите внимание на сивол & перед параметром result. Наличие этого символа говорит о том, что здесь мы применяем способ передачи параметров в функцию по ссылке, т.е. любые изменения переменной result изменят и значение переменной, которая была передана в качестве третьего параметра при вызове функции.
Более подробно об этом можно почитать в статье "Параметры функций".
Исходный код функции GetItem():
//+-------------------------------------------------------------------------------------------------+ //| Функция GetItem() | //| | //| Возвращает true, если не было ошибки, и false, если ошибка была| //| В третьем параметре функции возвращает элемент массива с | //| индексом index | //| | //| Параметры: | //| array - имя массива | //| index - индекс элемента | //| result - элемент массива с индексом index | //+-------------------------------------------------------------------------------------------------+ bool GetItem(string array, int index, double &result) { // Залокируем критическую секцию 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("GetItem()->GlobalVariableCheck(): ошибка ", err); return(false); } else count = 0; } else // переменная существует, получим количество элементов count = GlobalVariableGet(gv_count);
// Проверяем входной параметр на вхождение в допустимый диапазон if ((index<1)||(index>count)) { // Разлокировать критическую секцию Unlock(critical_section);
Print("GetItem(): значение входного параметра index (", index, ") не находится в допустимом диапазоне (1..", count,")"); return(false); }
result = GlobalVariableGet(array+DoubleToStr(index, 0));
// Разлокировать критическую секцию Unlock(critical_section);
err = GetLastError(); if (err!=0) { // Вывести сообщение об ошибке и выйти Print("GetItem()->GlobalVariableGet(): ошибка ", err); return(false); } else return(true); }
Думаю, что разобраться в этом коде Вам не составит труда:
- Локируем критическую секцию, чтобы исключить одновременный доступ к массиву из нескольких потоков.
- Получаем в переменную count количество элементов в массиве.
- Убеждаемся, что index находится в диапазоне 1..count.
- Читаем значение элемента с индексом index и передаем значение в третий параметр функции.
- Разлокируем критическую секцию.
Если в процессе выполнения функции встретятся ошибки, то разлокируем критическую секцию и вернем false.
В следующем выпуске я расскажу, как удалить элемент массива.
Все статьи по теме "Пишем советников для MetaTrader 4".
- Механическая торговая система - миф или реальность?
- С чего начать при написании советника:
- Создаем нового советника - Настраиваем параметры. - Язык MetaQuotes Language 4: