일반 클래스 라이브러리 - 버그, 설명, 질문, 사용 기능 및 제안 사항 - 페이지 25

 
Andrey Pogoreltsev :

내장 유형에만 적합한 컬렉션을 만들고 코드베이스에 넣는 이유는 무엇입니까?)

빌트인 구조에도 적합하지 않습니다.

 
Andrey Pogoreltsev :

말해봐, 내가 이해하지 못하는 부분이 있을지도 모르지만, 이 유형의 구성을 사용하려고 하면:

그런 다음 오류가 발생합니다.

'옵션' - 개체는 참조로만 전달됩니다. ICollection.mqh 십사 십팔

글쎄, 오류의 전체 스택이 더 있습니다 ...

그렇게 안 되니까 템플릿을 통해서 하셔야 해요. 저도 이 문제를 다루었거든요. 그래서 제가 직접 테스트 예제를 해봤는데, 모든 게 제대로 되는 것 같아요.

클래스 CData - 목록에 저장하려는 구조

CDataBase - 목록 자체

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

//+------------------------------------------------------------------+
class CData : public CObject
  {
public :
   int                x;
   double             y;
   datetime           t;
  };
//+------------------------------------------------------------------+
template < typename TDB> class CDataBase
  {
private :
   CList            *mlist;
   TDB              *TDBptr;
public :
   void CDataBase()           { mlist= new CList;                                       }
   void ~CDataBase( void )      { delete mlist;                                          }
   int ArraySize ( void )        { return (mlist.Total());                                 }
   TDB * operator []( int index) { return (mlist.GetNodeAtIndex(index));                   }
   void   AddValue (TDB &value){ TDBptr = new TDB; TDBptr  = value; mlist.Add(TDBptr);  }
   string TypeName()          { return ( typename (TDB));                                 }
   };
//+------------------------------------------------------------------+
// проверка, запишем  распринтуем значения
void OnStart ()
  {

   CDataBase<CData>*data= new CDataBase<CData>;
   CData *my= new CData;

   int i;
   Print ( "1------------------------------------" );
   for (i= 0 ; i< 10 ; i++)
     {
      my.x=i;
      my.y= i* 2 ;
      data.AddValue(my);
       Print (i, " : " ,data[i].x, " , " ,data[i].y, " / " ,my.x, " ," ,my.y);
     }
   Print ( "2------------------------------------" );
   for (i= 0 ; i<data. ArraySize (); i++)
     {
       Print (i, " : " ,data[i].x, " , " ,data[i].y);
     }
   Print (data.TypeName());
   delete my;
   delete data;
  }
//+------------------------------------------------------------------+

OnStart()에서 - 우리는 목록을 만들고 그것에 값을 쓴 다음 그것을 읽습니다. 나는 그것을 2번 확인합니다. 왜냐하면 처음에는 어딘가에 목록에 쓸 때 지역 변수 의 가시성을 잃었습니다. 모든 것을 적어 두었습니다. OK, 읽을 때 0 포인터를 읽고 오류가 발생했습니다.

 
Igor Makanu :

그렇게 안 되니까 템플릿을 통해서 하셔야 해요. 저도 이 문제를 다루었거든요. 그래서 제가 직접 테스트 예제를 해봤는데, 모든 게 제대로 되는 것 같아요.

클래스 CData - 목록에 저장하려는 구조

CDataBase - 목록 자체

OnStart()에서 - 우리는 목록을 만들고 그것에 값을 쓴 다음 그것을 읽습니다. 나는 그것을 2번 확인합니다. 왜냐하면 처음에는 어딘가에 목록에 쓸 때 지역 변수 의 가시성을 잃었습니다. 모든 것을 적어 두었습니다. OK, 읽을 때 0 포인터를 읽고 오류가 발생했습니다.

CData는 여전히 클래스이지 구조가 아니기 때문에 이 코드가 유용합니다. 클래스와 구조체에 제네릭을 동시에 사용하려고 하면 특히 삭제 연산자에 문제가 즉시 나타납니다. 이 "일반"에 대한 실험에서 나는 이것을 확신했습니다. 결론은 이 "일반" 라이브러리에는 삭제 연산자가 전혀 없으며 새 클래스를 이러한 "컬렉션"에 집어넣으면 프로그램을 종료한 후 많은 손실된 개체가 있다는 것입니다. 저것들. 처음에는 이 제네릭이 기본 유형에 대해서만 작성되었음을 알 수 있습니다.

 
Vasiliy Sokolov :

CData는 여전히 클래스이지 구조가 아니기 때문에 이 코드가 유용합니다. 클래스와 구조에 대해 동시에 제네릭을 사용하려고 하면 특히 삭제 연산자에 문제가 즉시 나타납니다. 이 "일반"에 대한 실험에서 나는 이것을 확신했습니다. 결론은 이 "일반" 라이브러리에는 삭제 연산자가 전혀 없으며 새 클래스를 이러한 "컬렉션"에 집어넣으면 프로그램을 종료한 후 많은 손실된 개체가 있다는 것입니다. 저것들. 처음에는 이 제네릭이 기본 유형에 대해서만 작성되었음을 알 수 있습니다.

물론, 구조가 아닌 클래스입니다. MQL에서 구조 사용을 중단했습니다. 구조는 이점을 제공하지 않지만 구조로 작업할 때 지속적인 버그와 시간 손실, 기본적으로 구조에 대한 질문에 대한 관리자의 오래된 메시지를 제공했습니다. 그들은 구조 대신 클래스를 사용한다고 대답했습니다. 이제 구조를 전혀 사용하지 않습니다.

추신: 구조 사용을 중단했을 때 찾았습니다. https://www.mql5.com/en/forum/6343/page866#comment_7541747

Вопросы от начинающих MQL5 MT5 MetaTrader 5
Вопросы от начинающих MQL5 MT5 MetaTrader 5
  • 2018.05.23
  • www.mql5.com
Подскажите пожалуйста, такой показатель тестера в жизни реален? И хороший это или плохой результат за год с депо 3000...
 
Andrey Pogoreltsev :

기본 제공 유형에만 적합한 경우 컬렉션을 만들고 코드베이스에 넣는 이유는 무엇입니까?)

일반 배송으로 제공되는 편리함. 따라서 풀 필요가 없습니다. 모든 사용자가 가지고 있습니다.

나는 이것을 오랫동안 내 KB-libs 중 하나에서 사용합니다.

 
Igor Makanu :

그렇게 안 되니까 템플릿을 통해서 하셔야 해요. 저도 이 문제를 다루었거든요. 그래서 제가 직접 테스트 예제를 해봤는데, 모든 게 제대로 되는 것 같아요.

클래스 CData - 목록에 저장하려는 구조

CDataBase - 목록 자체

OnStart()에서 - 우리는 목록을 만들고, 그것에 값을 쓴 다음 그것을 읽습니다. 나는 그것을 2번 확인합니다. 왜냐하면 처음에는 어딘가에 목록에 쓸 때 지역 변수 의 가시성을 잃었습니다. 모든 것을 적어 두었습니다. OK, 읽을 때 0 포인터를 읽고 오류가 발생했습니다.

음, 우선 목록에 할당자를 구현하고 거기에 포인터를 저장했습니다. 뿐만 아니라 파괴시 누수가 있음)

둘째, 올바른 것에 따르면 할당 연산자가 아닌 복사 생성자를 통해 수행해야했습니다. 하지만 그게 다야 IMHO)

그리고 가장 중요한 것은 개발자는 제네릭을 완성하고 내부에 할당자를 만들고 사용자 정의 개체를 지원하기만 하면 됩니다. C++는 이미 그들을 위해 모든 것을 발명했습니다) 그리고 우리는 자전거를 발명할 필요가 없습니다.

 
Andrey Pogoreltsev :

우선, 목록에 할당자를 구현하고 거기에 포인터를 저장했습니다. 뿐만 아니라 파괴시 누수가 있음)

누출은 어떻게 식별됩니까?

추신: 이것은 테스트 예제입니다. MQL에서 목록으로 작업하는 방법을 알아야 했기 때문에 테스트를 수행했습니다.

 
Andrey Pogoreltsev :

그리고 가장 중요한 것은 개발자는 제네릭을 완성하고 내부에 할당자를 만들고 사용자 정의 개체를 지원하기만 하면 됩니다. C++는 이미 그들을 위해 모든 것을 발명했습니다) 그리고 우리는 자전거를 발명할 필요가 없습니다.

모든 것이 너무 간단하면 씁니다.

 
Igor Makanu :

누출은 어떻게 식별됩니까?

추신: 이것은 테스트 예제입니다. MQL에서 목록으로 작업하는 방법을 알아야 했기 때문에 테스트를 수행했습니다.

new를 통해 AddValue에서 개체의 복사본을 만들지만 소멸자에서 개체를 해제하지 않고 포인터 목록을 지우면 됩니다.

 
TheXpert :

모든 것이 너무 간단하면 씁니다.

시간과 필요성이있을 것입니다 - 나는 쓸 것입니다. 일반적으로 예를 들어 베어링 모델이 하나만 필요한 경우 자체 베어링 공장을 만드는 것은 좋은 주제가 아닙니다)