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