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

 

Доброго времени суток (всех с праздником).
Требуется решить следующую задачу
Есть два массива 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);
  
}
Спасибо!
 
Проверьте выражение2 в цикле, при каком условии он должен прекратить итерации?
for (int i=0; ArraySize(Array1); i++)
 
Александр Иванчук:

Доброго времени суток (всех с праздником).
Требуется решить следующую задачу
Есть два массива 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 в случае неудачи.
 
Огромное спасибо! действительно глупейшая ошибка от замыленного глаза.... спасибо спасибо что ткнули носом....



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

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

Alexey Viktorov, 2017.02.14 13:22

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

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

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

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

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

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




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

действительно нужна функция поиска элемента в массиве и неужели ее тоже писать самому?
Попробуй поставить ещё сравнение на точное равенство. Если искомое значение и найденное не равны, то пишем в третий массив.
 
Эммм туплю (это мой первый код на mql), проверил справочник молчит он насчет точного равенства.
 
Александр Иванчук:
Эммм туплю (это мой первый код на mql), проверил справочник молчит он насчет точного равенства.
==
 
Александр Иванчук:
Эммм туплю (это мой первый код на 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++;
             }
Причина обращения: