오류, 버그, 질문 - 페이지 2657

 
Stanislav Korotky :

문제의 사실은 클래스 트리에 공통 노드 CWnd가 있다는 것입니다(CObject는 더 나아가 일반적으로 루트에 있음).

CButton -> CWndObj -> CWnd -> CObject.

메서드의 매개변수를 CObject로 변경하면 2배 더 많은 오류가 발생합니다.

어레이가 아닌 경우에도 유사한 클래스 계층이 작동합니다. 다음은 컴파일된 코드입니다.

문제는 어레이에서도 작동하도록 하는 방법입니다.

템플릿이 도움이 된다는 것을 알고 있지만 그냥 피하고 싶습니다.

IMHO는 상속 권한으로 템플릿 없이 작동해야 합니다.

C ++에서와 같이 확인되었습니다.

공장. 그러나 MQL은 인덱스가 있든 없든 이를 소화하지 않습니다.

C++의 경우 이 방법을 사용하면 예제가 더 명확해집니다. 그것을 실행하고 어떤 일이 일어나는지 보십시오 :)

 class CWnd
{
public :
     int x;
    CWnd( int _x = 10 ) : x(_x) {}
};
class CButton : public CWnd
{
     int a;
public :
    CButton( int _a= 6 ) : CWnd(),a(_a) {}
};

class Collection
{
public :
    Collection(CWnd* ptr,size_t size) {
         for ( int i = 0 ; i < size; cout << ptr[i++].x<<endl);
    }
};

int main()
{
    CButton buttons[ 10 ];
    CWnd wnd[ 10 ];
    Collection data1(&wnd[ 0 ],_countof(wnd));
    cout << "------------------------------" << endl;
    Collection data2(&buttons[ 0 ],_countof(buttons));
     return 0 ;
}
 

흠, 내 말투. 그런데 다음 질문이 생깁니다. 다음은 작동하는 C++ 코드입니다(이미 정확히 ;-).

 class Base
{
   public :
     virtual void method1( void ) { cout << "2\n" ; }
};

class Derived: public Base
{
   public :
     virtual void method1( void ) override { cout << "3\n" ; }
};

template < typename T>
class Wrapper
{
   public :
    Wrapper(T *ptr)
    {
      ptr->T::method1();
    }
};

int main()
{
  Derived d;
  d.Base::method1();   // ok
  Wrapper<Base> w(&d); // ok

   return 0 ;
}

유사한 MQL에서 오류가 발생합니다.

 class Base
{
   public :
     virtual void method1( void ) { Print ( __FUNCSIG__ ); }
};

class Derived: public Base
{
   public :
     virtual void method1( void ) override { Print ( __FUNCSIG__ ); }
};

template < typename T>
class Wrapper
{
   public :
    Wrapper(T *ptr)
    {
      ptr.T::method1(); // <<< 'Base' is not a class, struct or union
    }
};


void OnStart ()
{
  Derived d;
  d.Base::method1();   // ok
  Wrapper< Base > w(&d); // causes the error above
 
Stanislav Korotky :

흠, 내 말투. 그런데 다음 질문이 생깁니다. 다음은 작동하는 C++ 코드입니다(이미 정확히 ;-).

유사한 MQL에서 오류가 발생합니다.

문제를 모르지만 제 생각에는 다음과 같은 것을 찾고 있습니다.

 typedef void (*PTR)( void );

MQL에서는 함수 포인터입니다. void func(void)

클래스에서 유형이 PTR인 필드를 선언한 다음 여기에 함수를 할당한 다음 "포인터를 역참조"하고 함수를 호출할 수 있습니다.

절차적 스타일로 작성된 함수를 클래스로 전송하면 문제 없이 작동합니다. 클래스 메서드 , 아마도 그렇게 쉽게 전송하는 것은 불가능할 것입니다. dynamic_cast를 사용해 볼 수는 있지만 코드는 매우 혼란스러운

 
Igor Makanu :

나는 문제를 모르지만 내 생각에 당신은 다음과 같은 것을 찾고 있습니다.

MQL에서는 함수 포인터입니다. void func(void)

클래스에서 PTR 유형의 필드를 선언한 다음 여기에 함수를 할당한 다음 "포인터를 역참조"하고 함수를 호출할 수 있습니다.

절차적 스타일로 작성된 함수를 클래스로 전송하면 문제 없이 작동합니다. 클래스 메서드 , 아마도 그렇게 쉽게 전송하는 것은 불가능할 것입니다. dynamic_cast를 사용해 볼 수는 있지만 코드는 매우 혼란스러운

typedef는 이 메서드에서 작동하지 않습니다.

dynamic_cast는 상속자(더 긴 체인)에 대해 작동합니다. 즉, base에 대한 포인터에 파생이 포함되어 있으면 파생으로 캐스트할 수 있고 NULL이 아니면(즉, 캐스트가 정상임) 해당 메서드를 호출할 수 있습니다. 그러나 상황이 반대일 때 내 경우와 같이 파생에 대한 포인터가 있으며 정의에 따라 이 포인터도 기본입니다. 그리고 가상 메서드에 대한 모든 호출은 포인터가 파생된 "앉아 있고" 재정의된 구현을 호출하는 것을 잘라냅니다. 그리고 베이스가 필요합니다.

이를 위한 위의 구문 구조가 C++에 있지만 MQL은 C++가 아닙니다. 분명히 아직 아닙니다.

스스로 해결 방법을 만들었지 만 모든 작업에서 작동하지는 않습니다.

탬버린과 함께 하는 이 모든 춤의 의미는 항상 그렇듯이 혼란스러운 코드가 "라이브러리" 안에 남아 있고 이를 사용하는 코드가 수정처럼 명확하고 단순해지기 위한 것입니다.

 

테스터에서 rand()를 초기화하는 방법은 무엇입니까?

코드:

 input ulong param = 18446744073709551615 ;
void OnTick ()
   {
   }
//+------------------------------------------------------------------+
double OnTester ()
   {
       srand ( GetTickCount ()); 
       return ( rand ());
   }
//+------------------------------------------------------------------+

나는 이 의사 난수 생성을 별로 좋아하지 않습니다.


 
Igor Makanu :

테스터에서 rand()를 초기화하는 방법은 무엇입니까?

코드:

나는 이 의사 난수 생성을 별로 좋아하지 않습니다.


도움말: MathRand

메모

첫 번째 함수 호출 전에 MathSrand 함수를 사용하여 의사 난수 생성기를 초기 상태로 재설정해야 합니다.


지금 MathSrand로 시도하십시오.

Документация по MQL5: Математические функции / MathRand
Документация по MQL5: Математические функции / MathRand
  • www.mql5.com
Математические функции / MathRand - справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Vladimir Karputov :

도움말: MathRand

메모

첫 번째 함수 호출 전에 MathSrand 함수를 사용하여 의사 난수 생성기를 초기 상태로 재설정해야 합니다.

고마워요, 캡!

테스터에 관한 것입니다

이 코드는 TESTER에서도 작동하지 않습니다.

 input ulong param = 18446744073709551615 ;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit ()
   {
   MathSrand ( GetTickCount ()); 
   return ( INIT_SUCCEEDED );
   }
//+------------------------------------------------------------------+
void OnTick ()
   {
   }
//+------------------------------------------------------------------+
double OnTester ()
   {
       return ( rand ());
   }
//+------------------------------------------------------------------+
 
Igor Makanu :

테스터라면 MathSrand를 사용할 필요가 없다고 생각합니다.

그러나 이것이 도움이 되지 않으면 테스터가 MathSrand(GetTickCount())

그런 다음 MathSrand(int( GetMicrosecondCount()%1000000 ));

ZY 결국 GetTickCount()가 15.625밀리초마다 값을 변경한다는 점을 기억해야 합니다. 테스터에게는 매우 긴 시간입니다.

 
Nikolai Semko :

테스터라면 MathSrand를 사용할 필요가 없다고 생각합니다.

이것은 문서 https://www.mql5.com/ru/docs/math/mathland 와 모순됩니다.

첫 번째 함수 호출 전에 MathSrand 함수를 사용하여 의사 난수 생성기를 초기 상태로 재설정해야 합니다.

나는 alglib 소스를 뒤집고 싶지 않지만 신경망 패키지의 경우 NN 가중치의 임의 값으로 초기화하는 것이 필수입니다. MQL 도움말 자료에 따라 수행된 것으로 의심됩니다. 사용된 srand()

저것들. 테스터 내부에서 그러한 NS 패키지와 함께 MQL 프로그램을 사용하는 것은 하나의 프로세서 코어에서 일어날 가능성이 가장 큽니다. 초기 NS 가중치가 동일한 값을 가질까요?

srand() 없이도 쿨러

 int OnInit ()
   {
   return ( INIT_SUCCEEDED );
   }
//+------------------------------------------------------------------+
void OnTick ()
   {
   }
//+------------------------------------------------------------------+
double OnTester ()
   {
       return ( rand ());
   }
//+------------------------------------------------------------------+
 
Igor Makanu :

이것은 문서 https://www.mql5.com/ru/docs/math/mathland 와 모순됩니다.

나는 alglib 소스를 뒤집고 싶지 않지만 신경망 패키지의 경우 NN 가중치의 임의 값으로 초기화하는 것이 필수입니다. MQL 도움말 자료에 따라 수행된 것으로 의심됩니다. 사용된 srand()

저것들. 테스터 내부에서 그러한 NS 패키지와 함께 MQL 프로그램을 사용하는 것은 하나의 프로세서 코어에서 일어날 가능성이 가장 큽니다. 초기 NS 가중치가 동일한 값을 가질까요?

srand() 없이도 쿨러

이고르, 그럼 MathSrand(int(GetMicrosecondCount()%16384));

사진이 어떻게 변할지 궁금하네요