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

 
추상 클래스 의 개체를 만들 려고 할 때 로그에 너무 적은 오류 정보가 표시됩니다. 'CClass - 추상 클래스를 인스턴스화할 수 없습니다. 하지만 추상 메서드가 많고 손실을 찾는 데 시간이 오래 걸리기 때문에 어떤 메서드가 누락되었는지 알고 싶습니다. 첫 번째 누락된 메소드가 로그에 표시되는지 확인하시기 바랍니다.
 
Alexey Valeev :

2016년 8월 18일 오늘 업데이트 이후 OrderCalcMargin 함수는 0을 반환하기 시작했습니다.

터미널 버전 데모 5.00 빌드 1383

확인 코드:

터미널의 출력:

2016.08.18 20:35:36.394 테스트 (EURUSD,H1) OneLot=0.0 GetLastError=0

ps. 서비스데스크에도 글을 썼는데 여기도 주제가 맞아서 이 메시지에 더 빨리 답장을 보낼 수 있을 것 같아요.

오류가 수정되었습니다. 메시지 주셔서 감사합니다.
 

순수 가상 메서드 구현에 대한 확인 없음

 class A {
         virtual void f() = 0 ;
};
void A::f() {} //нормально
 
fxsaber :
디버그 오류(빌드 1383)
그들이 그것을 고칠 것이라고 생각했습니다. 하지만 아니오 - 1395.
 

물론 이것은 심각한 버그는 아니지만 계속해서 입력합니다.

OBJ_RECTANGLE_LABEL 유형의 그래픽 객체의 본질, 한두 픽셀이 사라지고 아무것도 아닌 것처럼 보이지만 어떻게 든 좋지 않습니다 ...

개체의 색상이 어두울 때 왼쪽 상단에서 사라집니다....

 
컴파일 중 오류
 template < typename T>
void f( T t1, T t2 = 0 ) {} //error: '0' - illegal operation use
괜찮아
 template < typename T>
class A {
void f( T t1, T t2 = 0 ) {} //нормально
};
 

MQL5\Include\environment.mqh에는 다음과 같은 복식 비교가 포함됩니다.

 //+------------------------------------------------------------------+
//| Сравнивает два значения типа double.                             |
//| RESULT                                                           |
//|   Возвращает истину, если значения равны и                       |
//|   ложь в противном случе.                                        |
//+------------------------------------------------------------------+
bool CEnvironment::DoubleEquals( const double a, const double b)
  {
//---
   return ( fabs (a-b)<= 16 * DBL_EPSILON * fmax ( fabs (a), fabs (b)));
//---
  }

도움말 에는 MQL4\Libraries\stdlib.mq4의 변형이 포함되어 있습니다.

 //+------------------------------------------------------------------+
//| right comparison of 2 doubles                                    |
//+------------------------------------------------------------------+
bool CompareDoubles( double number1, double number2)
  {
   if ( NormalizeDouble (number1-number2, 8 )== 0 ) return ( true );
   else return ( false );
  }
 
fxsaber :

MQL5\Include\environment.mqh에는 다음과 같은 복식 비교가 포함됩니다.

도움말 에는 MQL4\Libraries\stdlib.mq4의 변형이 포함되어 있습니다.

더블 룩. 독서. 그리고 우리는 비교하는 두 가지 방법을 봅니다.

  • 첫 번째 방법은 두 숫자의 차이를 비교 정확도를 지정하는 작은 값과 비교하는 것입니다.
    예시:
     bool EqualDoubles( double d1, double d2, double epsilon) 
      { 
       if (epsilon< 0 ) epsilon=-epsilon; 
    //--- 
       if (d1-d2>epsilon) return false ; 
       if (d1-d2<-epsilon) return false ; 
    //--- 
       return true ; 
      } 
    void OnStart () 
      { 
       double d_val= 0.7 ; 
       float   f_val= 0.7 ; 
       if (EqualDoubles(d_val,f_val, 0.000000000000001 )) Print (d_val, "equals" ,f_val); 
       else Print ( "Different: d_val = " , DoubleToString (d_val, 16 ), 
                   "  f_val = " , DoubleToString (f_val, 16 )); 
    // Результат: Different: d_val= 0.7000000000000000   f_val= 0.6999999880790710 
      }

  • 두 번째 방법은 두 실수의 정규화된 차이를 0과 비교하는 것입니다. 정규화된 숫자의 차이를 0과 비교하는 것은 쓸모가 없습니다. 정규화된 숫자를 사용한 수학 연산의 결과로 결과가 비정규화되기 때문입니다.
    예시:
     bool CompareDoubles( double number1, double number2) 
      { 
       if ( NormalizeDouble (number1-number2, 8 )== 0 ) return ( true ); 
       else return ( false ); 
      } 
    void OnStart () 
      { 
       double d_val= 0.3 ; 
       float   f_val= 0.3 ; 
       if (CompareDoubles(d_val,f_val)) Print (d_val, "equals" ,f_val); 
       else Print ( "Different: d_val = " , DoubleToString (d_val, 16 ), 
                   "  f_val = " , DoubleToString (f_val, 16 )); 
    // Результат: Different: d_val= 0.3000000000000000   f_val= 0.3000000119209290 
      }

 
Karputov Vladimir :

두 번째 방법은 두 실수의 정규화된 차이를 0과 비교하는 것입니다. 정규화된 숫자의 차이를 0과 비교하는 것은 쓸모가 없습니다 . 정규화된 숫자를 사용한 수학 연산의 결과로 결과가 비정규화되기 때문입니다.

사실이 아니다. 정규화된 값이 같으면 두 개의 정규화된 두 배의 차이는 항상 0이 됩니다. float와 double을 비교하는 예제는 필요하지 않습니다. 이것은 두 개의 더블의 경우가 아닙니다.

또한 정규화 된 값이 서로 동일한 두 개의 숫자를 사용할 수 있습니다. 그러나 정규화된 차이는 0이 아닙니다.

 

컴파일 오류: ')' - 모든 제어 경로가 값을 반환하는 것은 아닙니다.

 int f()
{
         while ( true ) //или for(;;)
        {
//много строк c return, continue, без break
                 return 0 ;
//много строк c return, continue, без break
                 return 1 ;
        }
}