ArrayBsearch не работает как надо

 
         double Upper_LastValue=ND(iFractals(NULL,0,MODE_UPPER,i+ForBars+3));
            if(Upper_LastValue!=0){
            
               if(StrToTime("2007.11.01 08:25")==Time[i+ForBars+3]){
                  Alert("Буду искать:  ",Upper_LastValue);
                  Alert("В массиве - ^");  
                     for(int j=0;j<ArraySize(Upper_UnikalValues);j++){
                        Alert(j," - ",Upper_UnikalValues[j]);//,"("+Upper_UnikalCounter[j]+")");
                     }  
                  tmpc=ArrayBsearch(Upper_UnikalValues,Upper_LastValue,ArraySize(Upper_LastValue),0,MODE_DESCEND);             
                  Alert("Нашел индекс: "+tmpc," и его значение в массиве: ",Upper_UnikalValues[tmpc]);
              }
...
 
Сначала некоторое время работает как надо, а потом...
 
Как происходит заполнение массива Upper_UnikalValues?
Налицо некорректное сравнение double чисел на равенство в функции ArrayBsearch или неправильное заполнение массива Upper_UnikalValues.
 
Здесь весь код
Файлы:
abstest.mq4  6 kb
 

Массив регулярно массштабируется, или увеличивается его размер - в конец добавляется новый элемент, или удаляется элемент и массив обрезается.

 
Я проверил на простом варианте и на самом деле есть расхождение. Видимо, дело в прямом сравнении double чисел в функции ArrayBsearch - в понедельник проверим в отладчике.
int start()
  {
   double buf[]={ 1.4472, 1.4474, 1.4476, 1.4442, 1.4435 };
   double val=1.4474;
//---- печатаем значения
   for(int i=0;i<ArraySize(buf);i++) Print(i," - ",buf[i]);
//---- ищем
   int pos=ArrayBsearch(buf,val,ArraySize(buf),0,MODE_DESCEND);             
   Print("Нашел индекс: ",pos," и его значение в массиве: ",buf[pos]);
//----
   return(0);
  }
Нашел индекс: 0 и его значение в массиве: 1.4472
4 - 1.4435
3 - 1.4442
2 - 1.4476
1 - 1.4474
0 - 1.4472
 

Вообще-то ArrayBsearch ищет данные в отсортированном массиве. 1.4472, 1.4474, 1.4476 возрастающая последовательность, при чём тут MODE_DESCEND? оказывается вот при чём 1.4442, 1.4435

Пожалуйста, сначала отсортируйте Вашу последовательность соответсвующим образом, то есть по убыванию значений

 
Понял!
 

ArrayBsearch

Это вообще лажа. Такое намутили.

Ищет в отсортированому по возрастанию масиву! Классс!!!

 

Неужели нельзя сделать проще?

буфер,что ищем

Нашли точное число функция возвратила индекс.

Не нашли возвратила -1 

 
eevviill:

ArrayBsearch

Это вообще лажа. Такое намутили.

Ищет в отсортированому по возрастанию масиву! Классс!!!

 

Неужели нельзя сделать проще?

буфер,что ищем

Нашли точное число функция возвратила индекс.

Не нашли возвратила -1 

М-да, надеюсь Кнут вам поможет понять.
В неотсортированном массиве поиск реализуется в 8 строк:
for(int i=0,n=ArraySize(arr);i<n;i++)
  {
   if(arr[i]==X)
     {
      FOUND_INDEX=i;
      break;
     }
  }
 
mql5:
М-да, надеюсь Кнут вам поможет понять.
В неотсортированном массиве поиск реализуется в 8 строк:

Этот кнут можете себе оставить, лучше сделайте нормальную функцию поиска в массиве. Ато люди по 5 часов с БеСерчь мучаются.

 https://forum.mql4.com/ru/3694/page2#1014137

Причина обращения: