エラー、バグ、質問 - ページ 1642

 
抽象クラスのオブジェクトを作成 しようとすると、ログに「CClass - cannot instantiate abstract class」というエラーの情報が少なすぎる。 また、抽象メソッドが多く、足りないメソッドを探すのに時間がかかるので、どのメソッドが足りないのか知りたい。 ログに最初の足りないメソッドを表示するようにしてほしい。
 
Alexey Valeev:

本日2016.08.18のアップデート後、OrderCalcMargin関数が0を返すようになりました。

ターミナル版デモ 5.00 ビルド 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の ようなグラフィックオブジェクトの本質が2〜1ピクセル消えるのは、何でもないように見えますが、良くないことです.

オブジェクトが暗い色で表示されると、左上に表示されなくなる。

 
コンパイルエラー
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では、このような二重の比較があります。

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

Helpには、MQL4Librariesのバリアントがあります。

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

MQL5では、このような二重の比較があります。

Help には、MQL4 のバリアントである、Thinkstadlib.mq4 があります。

ダブル ルックそして、それを読みました。そして、2つの比較の仕方が見えてきます。

  • 最初の方法は、2つの数値の差を、比較の精度を定義するある小さな値で比較することからなる。
    例。
    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 
      }

  • 2つ目の方法は、2つの実数の差を正規化し、その値を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:

2つ目の方法は、2つの実数の差を正規化してゼロと比較する方法である。正規化された数値の差をゼロと 比較しても意味がない。正規化された数値を用いた数学的演算は、正規化されていない結果をもたらすからである。

これは事実ではありません。正規化された2つの倍数の差は、正規化された値が同じであれば、常に0になる。floatとdoubleを比較するときに例を挙げる必要はないですね。ダブルが2つある場合ではありません。

さらに、正規化された値が互いに等しい2つの数値を取ることができます。しかし、その正規化された差はゼロにはならない。

 

コンパイルエラー: ')'- すべてのコントロールパスが値を返すわけではない

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