« Предыдущий пост | На главную страницу | Следующий пост »

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

« Предыдущий пост | На главную страницу | Следующий пост »

Комментарии по теме "Глобальные массивы: функция AddItem()"

Андрюша привет!
Я рад твоему продвижению вперёд,тем более,что у меня прекрасные вепчатления осталысь от общения с тобой в Москве на Форекс-експо в Радисон Славянская в прошлом году в Марте!
Очень ценью что ты так образованный человек и трудишься!
Прошу елси тебя не затруднит,войды в контакт со мной по АСКЕ 157358993,буду рад пообщатся и есть что сказать
Это Мераб из Харькова
Спасибо за вниманые!

Спасибо за комментарий.

Если честно, то практически перестал использовать аську для общения. Мой емейл все тот же.

Рабочий телефон: +44 20 7648 4560 (но возьмут трубку вначале англоговорящие сотрудники).

Подписаться на мою рассылку



Размещение статьи "Глобальные массивы: функция AddItem()" на Вашем сайте

Размещение статьи "Глобальные массивы: функция AddItem()" на Вашем сайте возможно при условии выполнениия следующих условий:

  • Запрещается изменение оригинального текста без согласия автора - Андрея Ведихина.
  • Должен быть указан первоисточник. В случае публикации в интернете Вы должны разместить следующий код гиперссылки без изменений:
  • Запрещается коммерческое использование материалов, взятых с блога "Интернет-трейдинг на форекс / forex". Доступ к ним должен быть свободным, без взимания какой-либо платы, без обязательной регистрации и/или заполнения опросного листа (анкеты) и т.д.

В случае выполнения данных условий не требуется согласия автора блога "Интернет-трейдинг на форекс / forex" на размещение статьи "Глобальные массивы: функция AddItem()" на Вашем сайте.

Журнал FOREX MAGAZINE:



Архив номеров FOREX MAGAZINE
Котировки Forex:

Счетчики:

Авторские права © 2005-2006 Андрей Ведихин

Условия использования материалов блога "Интернет-трейдинг на форекс / forex"

Контакты с автором:


Движок сайта:
Movable Type 5.04