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

 
MT5デバッガ(ビルド2450)のバグで、手動で設定したブレークポイントが正しくトリガされない:
void test(){
   if(false){
      int i = 1;      // вручную установленная точка останова
   }   
}                     // место срабатывания точки останова при отладке

void OnStart(){
   test();   
}


UPD:
批判をありがとう、元のプロジェクトに 戻り、コードの過度の最適化なしで発生した問題を強調した:
class A{
public:
   bool m_flag;
   A* m_next;
   A(bool flag) : m_flag(flag){}
   
   void test(){
      if(m_flag){
         printf("1");
         m_next = m_next;    // Вручную установленная точка останова срабатывает как для false так и true условий
         //m_next = &this;   // Ok
      }   
   }
};

void OnStart(){
  {A a(false); a.test();}   // Result: breakpoint              Expected result: 
  {A a(true);  a.test();}   // Result: printf + breakpoint     Expected result: printf + breakpoint
}
 
Sergey Dzyublik:
MT5デバッガ(ビルド2450)のバグで、手動で設定したブレークポイントが正しくトリガされない:

なぜ、こんな苦労をしなければならないのか、説明してもらえますか?

if(false)
デバッガーを使っていますか?
 
Sergey Chalyshev:

なぜこのように捻じ曲げなければならないのか、説明していただけますか?

デバッガは使っていますか?

コードには条件が入力できないBAGが表示されていますが、それでもコード内の全く別の場所でブレークポイントが 発動します。
その他の質問は?

 

オープニングサポートに以下のメッセージを書きました。

ロボットをネタにテスト。奇妙な結果が出た。表の下部がスクリーンショットにあります。10万ルーブルで取引していることを考えると、マイナス収支の-6049、ドローダウン17%というのは信じられないような気がします。確かに、このパラメータのセットをテストするチャートを 開くと、指定したドローダウンでプラス収支になる。アカウントは本物の75287(写真の通り)です。このようなプログラムの動作には、どのような理由があるのでしょうか?

また、すべてのパラメータセットがこのように動作することも付け加えられます。

答えが出た。

残念ながら、このような問題はテクニカルサポートの範囲ではありません。

端末の開発者にお問い合わせください。

その理由は何でしょうか?

 
Sergey Dzyublik:

このコードでは、条件が入力できないBAGが表示されていますが、それでもコード内の全く別の場所でブレークポイントをトリガーしています。
その他の質問は?

すべてが正しく思えるのです。プログラムはif(false)を無視し、コードで最も近い場所でトリガーをかける)。

 
TraSer:

すべて正しいようです。プログラムはif(false)を無視し、コードの最も近い場所でトリガーをかける)。

これはまったく正しくない。条件を満たしたときだけ停止する必要があるのに、停止が毎ティックに あると、その間、おかしくなってしまうので...。

 
Sergey Dzyublik:

他に質問はありますか?

コンパイル時に if(false) 条件 {......} のテキストを捨てなかったのはなぜでしょうか?

ブレークポイントは、MEが文字列や折り返しなどのVSワンダーをシフトできないため、残りのコードの最初のMEテキスト文字に表示されます。

MEはリアルタイムでコードを解析できない、せいぜい自動置換が利用できる程度

バグるにはバグるが

 
Igor Makanu:

コンパイラがプロジェクトのコンパイル時に if(false) 条件 {...} のテキストを捨てなかったと考える根拠は何でしょうか?

ブレークポイントは、MEが文字列、折り返し、その他のVSの不思議をシフトすることができないので、残りのコードの最初のMEテキスト文字にあった。

MEはリアルタイムでコードを解析できない、せいぜい自動置換が利用できる程度

が、バグならバグで仕方ない。

正常な状態でテストする必要があります。先日、こんなことがありました:コードを一歩一歩実行するとき

  if(desiredProfit > 0 && summProfit > desiredProfit)
   {
    CloseAllPosition();
    DeleteAllPending();
    openSeries = Should_I_open;
    return;
   }

デバッガで、明示的な条件が満たされていない状態で、関数呼び出しは 実行されず、return; が実行されました。私は、曲がったブラケットの後にはもうコードがなく、 void OnTick() を終了する曲がったブラケットがもう一つあるだけなので、コンパイラは return を移動したと判断しました。

 
Alexey Viktorov:

これは、正常な状態でテストする必要があります。

そう、それこそ虚偽ではなく、みたいな。

int i=1;
if(--i == 0)...

通常、コンパイラはコンパイル時にそのような条件を見ません。

 
批評をありがとうございます。元の原稿に 戻り、コードを最適化しすぎることなく、発生した問題を強調しました:
class A{
public:
   bool m_flag;
   A* m_next;
   A(bool flag) : m_flag(flag){}
   
   void test(){
      if(m_flag){
         printf("1");
         m_next = m_next;    // Вручную установленная точка останова срабатывает как для false так и true условий
         //m_next = &this;   // Ok
      }   
   }
};

void OnStart(){
  {A a(false); a.test();}   // Result: breakpoint              Expected result: 
  {A a(true);  a.test();}   // Result: printf + breakpoint     Expected result: printf + breakpoint
}