Метод MQL4/5 CList Search всегда возвращает нулевой указатель

Я пытаюсь использовать метод CList Search в приложении. Я приложил очень простой пример ниже. В этом примере я всегда получаю нулевой указатель в переменной result. Пробовал на MQL4 и MQL5. Кто-нибудь когда-нибудь заставлял метод поиска работать? Если да, то где моя ошибка? В своем вопросе я ссылаюсь на эту реализацию связанного список на MQL (это стандартная реализация). Конечно, в моем приложении я хочу найти не первый элемент списка, а элементы, соответствующие определенным критериям. Но даже этот тривиальный пример у меня не работает.

#property strict
#include <Arrays\List.mqh>
#include <Object.mqh>

class MyType : public CObject {
   private:
      int val;
   public:
      MyType(int val);
      int GetVal(void);   
};
MyType::MyType(int val): val(val) {}
int MyType::GetVal(void) {
   return val;
}

void OnStart() {
   CList *list = new CList();
   list.Add(new MyType(3));

   // This returns a valid pointer with
   // the correct value
   MyType* first = list.GetFirstNode();

   // This always returns NULL, even though the list
   // contains its first element
   MyType* result = list.Search(first);

   delete list;
}

person Lukas Nothhelfer    schedule 04.09.2019    source источник


Ответы (1)


CList — это своего рода связанный список. Классический arraylist — это CArrayObj в MQL4/5 с Search() и некоторыми другими методами. Вы должны отсортировать список (поэтому реализуйте метод virtual int Compare(const CObject *node,const int mode=0) const) перед вызовом поиска.

virtual int       MyType::Compare(const CObject *node,const int mode=0) const {
  MyType *another=(MyType*)node;
  return this.val-another.GetVal();
}

void OnStart(){
  CArrayObj list=new CArrayObj();
  list.Add(new MyType(3));
  list.Add(new MyType(4));
  list.Sort();

  MyType *obj3=new MyType(3), *obj2=new MyType(2);
  int index3=list.Search(obj3);//found, 0
  int index2=list.Search(obj2);//not found, -1
  delete(obj3);
  delete(obj2);
}
person Daniel Kniaz    schedule 05.09.2019
comment
Спасибо за ваш ответ. У вас есть ссылки на ваш ответ? - person Lukas Nothhelfer; 06.09.2019
comment
какая справка вам нужна? - person Daniel Kniaz; 06.09.2019
comment
Почему я должен сортировать список перед поиском в нем? Никакой другой язык не производит таких накладных расходов!? - person Lukas Nothhelfer; 06.09.2019
comment
Вы можете выполнять линейный поиск или сортировать и применять быстрый поиск. Search() — это реализация быстрого механизма, поэтому сначала нужно отсортировать. Откройте исходный код CArrayObj.mqh, чтобы увидеть, как он реализован, чтобы понять, зачем нужна сортировка. - person Daniel Kniaz; 06.09.2019
comment
Привет, Даниэль. Ваш ответ не работает. Ошибка: «виртуальный» — неожиданный токен - person Umit Terzi; 23.06.2020
comment
покажи свой источник. Скорее всего вы не унаследовали от базового класса или пропустили ; в предыдущей строке - person Daniel Kniaz; 24.06.2020