错误、漏洞、问题 - 页 1642

 
当试图创建 一个抽象类的对象 时,日志显示的错误信息太少了:'Class - cannot instantiate abstract class.'而我想知道缺少哪些方法,因为有这么多的抽象方法,要花很长时间才能找到缺少的方法。 请确保日志中指出第一个缺少的方法。
 
Alexey Valeev:

今天18.08.2016的更新后,OrderCalcMargin函数开始返回0。

终端版本演示5.00 build 1383

测试代码。

输出在终端。

2016.08.18 20:35:36.394 测试 (EURUSD,H1) OneLot=0.0 GetLastError=0

ps:也给servicedesk写过信,但这里也有一个合适的主题,所以也许这个消息会更快得到回应。

修正了它。谢谢你的信息。
 

对纯虚拟方法的实现没有检查

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 
      }

  • 第二种方法是将两个实数之间的归一化差值与零值进行比较。将归一化的数字之差与零进行比较是没有用的,因为对归一化的数字进行的任何数学运算都会产生一个未归一化的结果。
    例子。

    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:

第二种方式是将两个实数的归一化差值与零进行比较。将归一化的数字之差与零进行比较是没有用的,因为对归一化的数字进行的任何数学运算都会产生一个未归一化的结果。

这是不正确的。如果两个归一化的双数的值相同,它们的差值将总是零。在比较float和double时,我不需要举例。这不是两个替身的情况。

此外,你可以取两个归一化值相等的数字。但它们的归一化差异将不等于零。

 

编译错误:')'- 不是所有的控制路径都会返回一个值

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