Сравнение массивов, сломал голову с OUT OF RANGE

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Александр Иванчук
294

Доброго времени суток (всех с праздником).
Требуется решить следующую задачу
Есть два массива Array1 и Array2 всегда исполняется условие что Array1>=Array2, нужно найти те элементы Array1, которых нет в Array2 и поместить в третий Массив

Навоял следующий код (по его результату в результативном массиве должен лежать 1 элемент со значением 8):

//--- input parameters
input int      Koof= 10;
input int Slippage = 2;


//User Functions
bool MyArrayCompare(int &Array1[], int &Array2[], int &ArrayDest[])
{

        int j=0;
        ArraySort(Array1,WHOLE_ARRAY,0,MODE_ASCEND);
        ArraySort(Array2,WHOLE_ARRAY,0,MODE_ASCEND);
        int size = ArraySize(Array1);
        for (int i=0; ArraySize(Array1); i++)
        {
            /// Для каждого элемента большого массива ищем такой же элемент в маленьком, если находим ничего не делаем если нет то кладем в результирующий массив
            int k=ArrayBsearch(Array2,Array1[i],WHOLE_ARRAY,0,MODE_ASCEND);
            if (ArrayBsearch(Array2,Array1[i],WHOLE_ARRAY,0,MODE_ASCEND)==0) // если 0 то не нашли
            {
               ArrayDest[j]=Array1[i];
               j++;
            }
        }
  
  
  return 0;
}

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- create timer
   EventSetTimer(60);

//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//--- destroy timer
   EventKillTimer();

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
{
  
   int ParentsOrders[] = {2,3,4,5,6,7,8};
   int ChildOrders  [] = {2,3,4,5,6,7};

   int ArrayDest[10];
   ArrayResize(ArrayDest,10);
  

   int PCnt =0;
   int CCnt=0; //считаем сколько детей и сколько родаков

  
   MyArrayCompare(ParentsOrders,ChildOrders,ArrayDest);
  
}
Спасибо!
Vasiliy Pushkaryov
6957
Vasiliy Pushkaryov  
Проверьте выражение2 в цикле, при каком условии он должен прекратить итерации?
for (int i=0; ArraySize(Array1); i++)
Alexey Viktorov
25773
Alexey Viktorov  
Александр Иванчук:

Доброго времени суток (всех с праздником).
Требуется решить следующую задачу
Есть два массива Array1 и Array2 всегда исполняется условие что Array1>=Array2, нужно найти те элементы Array1, которых нет в Array2 и поместить в третий Массив

Навоял следующий код (по его результату в результативном массиве должен лежать 1 элемент со значением 8):

//--- input parameters
input int      Koof= 10;
input int Slippage = 2;


//User Functions
bool MyArrayCompare(int &Array1[], int &Array2[], int &ArrayDest[])
{

        int j=0;
        ArraySort(Array1,WHOLE_ARRAY,0,MODE_ASCEND);
        ArraySort(Array2,WHOLE_ARRAY,0,MODE_ASCEND);
        int size = ArraySize(Array1);
        for (int i=0; ArraySize(Array1); i++)
        {
            /// Для каждого элемента большого массива ищем такой же элемент в маленьком, если находим ничего не делаем если нет то кладем в результирующий массив
            int k=ArrayBsearch(Array2,Array1[i],WHOLE_ARRAY,0,MODE_ASCEND);
            if (ArrayBsearch(Array2,Array1[i],WHOLE_ARRAY,0,MODE_ASCEND)==0) // если 0 то не нашли
            {
               ArrayDest[j]=Array1[i];
               j++;
            }
        }
  
  
  return 0;
}

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- create timer
   EventSetTimer(60);

//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//--- destroy timer
   EventKillTimer();

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
{
  
   int ParentsOrders[] = {2,3,4,5,6,7,8};
   int ChildOrders  [] = {2,3,4,5,6,7};

   int ArrayDest[10];
   ArrayResize(ArrayDest,10);
  

   int PCnt =0;
   int CCnt=0; //считаем сколько детей и сколько родаков

  
   MyArrayCompare(ParentsOrders,ChildOrders,ArrayDest);
  
}
Спасибо!
1. Выделенная строка должна быть так...
for (int i=0; i < ArraySize(Array1); i++)
2. Сортировка первого массива необязательна.

3. Если объявлен статический массив, то зачем ему ArrayResize с тем-же размером?

И самое главное, всё это мартышкин труд. потому, что

Возвращаемое значение

Возвращает индекс найденного элемента. Если искомое значение не найдено, то возвращает индекс ближайшего по значению элемента.

Следовательно любое значение первого массива будет найдено во втором. Пусть не совсем оно, но довольствуйся тем что есть.

Очень жаль что так испоганили язык. Раньше, если правильно помню, была возможность задать флаг, возвратить ближайшее или -1 в случае неудачи.
Александр Иванчук
294
Александр Иванчук  
Огромное спасибо! действительно глупейшая ошибка от замыленного глаза.... спасибо спасибо что ткнули носом....



Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Сравнение массивов, сломал голову с OUT OF RANGE

Alexey Viktorov, 2017.02.14 13:22

1. Выделенная строка должна быть так...
for (int i=0; i < ArraySize(Array1); i++)
2. Сортировка первого массива необязательна.

3. Если объявлен статический массив, то зачем ему ArrayResize с тем-же размером?

И самое главное, всё это мартышкин труд. потому, что Следовательно любое значение первого массива будет найдено во втором. Пусть не совсем оно, но довольствуйся тем что есть.

Очень жаль что так испоганили язык. Раньше, если правильно помню, была возможность задать флаг, возвратить ближайшее или -1 в случае неудачи.

А вот как быть с мартышкиным трудом?

действительно нужна функция поиска элемента в массиве и неужели ее тоже писать самому?
Alexey Viktorov
25773
Alexey Viktorov  
Александр Иванчук:
Огромное спасибо! действительно глупейшая ошибка от замыленного глаза.... спасибо спасибо что ткнули носом....




А вот как быть с мартышкиным трудом?

действительно нужна функция поиска элемента в массиве и неужели ее тоже писать самому?
Попробуй поставить ещё сравнение на точное равенство. Если искомое значение и найденное не равны, то пишем в третий массив.
Александр Иванчук
294
Александр Иванчук  
Эммм туплю (это мой первый код на mql), проверил справочник молчит он насчет точного равенства.
Andrey Dik
13671
Andrey Dik  
Александр Иванчук:
Эммм туплю (это мой первый код на mql), проверил справочник молчит он насчет точного равенства.
==
Alexey Viktorov
25773
Alexey Viktorov  
Александр Иванчук:
Эммм туплю (это мой первый код на mql), проверил справочник молчит он насчет точного равенства.
Точное равенство это знак ==

Вместо этого
            if (ArrayBsearch(Array2,Array1[i],WHOLE_ARRAY,0,MODE_ASCEND)==0) // если 0 то не нашли
            {
               ArrayDest[j]=Array1[i];
               j++;
            }
Вот это

            if(Array2[ArrayBsearch(Array2, Array1[i], WHOLE_ARRAY, 0, MODE_ASCEND)] != Array1[i]) // если найденное значение не равно искомому
             {
               ArrayDest[j]=Array1[i];
               j++;
             }
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий