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

 

もちろん間違っているかもしれませんが、2ヶ月前は私のテンプレートが動作していたようで、今はCListのデストラクタを呼び出すと、破壊さ れなかったオブジェクトが メモリ内に残るというコードになっています。

#property strict
#include <Arrays\List.mqh>
//+------------------------------------------------------------------+
class CData : public CObject
  {
public:
   int               x;
   double            y;
                     CData(){};
                     CData(int ival,double dval){x=ival;y=dval;}
  };
//+------------------------------------------------------------------+
template<typename T>class CDataBase
  {
private:
   CList            *mlist;
   T                *Tptr;
public:
   void CDataBase()           { mlist=new CList;                                    }
   void ~CDataBase(void)      { delete mlist;                                       }
   int ArraySize(void)        { return(mlist.Total());                              }
   T *operator[](int index)   { return(mlist.GetNodeAtIndex(index));                }
   void  AddValue (T &value)  { Tptr = new T; Tptr  = value; mlist.Add(Tptr);       }
   string TypeName()          { return(typename(T));                                }
  };
//+------------------------------------------------------------------+
void OnStart()
  {
   CDataBase<CData>*data=new CDataBase<CData>;
   int i;
   for(i=0; i<5; i++)
     {
      data.AddValue(new CData(i,i*2.0));
     }

   for(i=0; i<data.ArraySize(); i++)
     {
      Print(i," : ",data[i].x," , ",data[i].y);
     }
   Print(data.TypeName());
   delete data;
  }
//+------------------------------------------------------------------+

2019.06.21 07:19:45.926 tstlist (EURUSD,H1) 0 : 0 , 0.0

2019.06.21 07:19:45.926 tstlist (EURUSD,H1) 1 : 1 , 2.0

2019.06.21 07:19:45.926 tstlist (EURUSD,H1) 2 : 2 , 4.0

2019.06.21 07:19:45.926 tstlist (EURUSD,H1) 3 : 3 , 6.0

2019.06.21 07:19:45.926 tstlist (EURUSD,H1) 4 : 4 , 8.0

2019.06.21 07:19:45.926 tstlist (EURUSD,H1) CData

2019.06.21 07:19:45.926 tstlist (EURUSD,H1) 未削除のオブジェクトが5個残っています。

2019.06.21 07:19:45.926 tstlist (EURUSD,H1) 5 objects of type CData left.

2019.06.21 07:19:45.926 tstlist (EURUSD,H1) 280 bytes of leaked memory

MT5ビルド2085
 
Igor Makanu:

もちろん間違っているかもしれませんが、2ヶ月前は私のテンプレートが動作していたようなのですが、今はCListのデストラクタを呼び出すと、破壊されていないオブジェクトが メモリに残っている、というコードになっています。

#property strict
#include <Arrays\List.mqh>
//+------------------------------------------------------------------+
class CData : public CObject
  {
public:
   int               x;
   double            y;
                     CData(){};
                     CData(int ival,double dval){x=ival;y=dval;}
  };
//+------------------------------------------------------------------+
template<typename T>class CDataBase
  {
private:
   CList            *mlist;
   T                Tptr;
public:
   void CDataBase()           { mlist=new CList;                                    }
   void ~CDataBase(void)      { delete mlist;                                       }
   int ArraySize(void)        { return(mlist.Total());                              }
   T operator[](int index)   { return(mlist.GetNodeAtIndex(index));                }
   void  AddValue (T &value)  { Tptr  = value; mlist.Add(Tptr);      }
   string TypeName()          { return(typename(T));                                }
  };
//+------------------------------------------------------------------+
void OnStart()
  {
   CDataBase<CData*>* data=new CDataBase<CData*>;
   int i;
   for(i=0; i<5; i++)
     {
      CData* Tmp = new CData(i,i*2.0);
      data.AddValue(Tmp);
     }

   for(i=0; i<data.ArraySize(); i++)
     {
      Print(i," : ",data[i].x," , ",data[i].y);
     }
   Print(data.TypeName());
   delete data;
  }
//+------------------------------------------------------------------+
 
fxsaber:

そうですね、あなたのサンプルは正しく動作しています。

ありがとうございました。

 
Вероника Сорокина:
こんにちは。こんな状況です。私が書いたmql4 Expert Advisor/Script/Indicator/Whateverはチャートウィンドウに添付されず、プログラムに添付されたままにしておきたいのです。例えば、私は便利なものを書くので、新しいオープンチャートに常に添付されるのは嫌です。サービスみたいなもの(MT5から)、でもMT4では必要ですよね。

サービスを利用する

 

MEから現在のコードをTerminal Favouritesに追加することは可能でしょうか?



実は、「デバッグ」タブを別に用意して、現在書いているコードやテスト中のコードを追加できるようにしたいんです。

今、便利な仕事をするためには、現在のプロジェクトに 関係ないものはすべて排除した、別のターミナルが必要であることがわかりました。

そうすれば、Terminal 自体で残りのコードと混同することがないため、デバッグが非常に速くなります。

 

開発者の皆様へ。インジケーターバッファの自動再分割は正常なのか、明らかにしてください。再分割とは次のような意味です:ウィンドウ内のバーの最大値、例えば5000。バッファサイズ+rates_totalは、6439になると5000にリセットされます。ウィンドウ内の最大バー数=10000の場合も同様です。11439でリセットが発生します。

このため、インジケーターがクラッシュしたり、不正なデータが表示されることがあります。

2085年を構築する。2000年頃のビルドから、そのような挙動に気づきました。

 
Alexey Kozitsyn:

開発者の皆様へ。インジケーターバッファの自動再分割は正常なのか、明らかにしてください。再分割とは次のような意味です:ウィンドウ内のバーの最大値、例えば5000。バッファサイズ+rates_totalは、6439になると5000にリセットされます。 ウィンドウ内の最大バー数=10000の場合も同様です。11439でリセットが発生します。

このため、インジケーターがクラッシュしたり、不正なデータが表示されることがあります。

2085年を構築する。この動作は2000ビルドくらいから気づいていました。

この動作はもともと5で

バッファの再割り当てによるインジケータのクラッシュの例を挙げてください。

 
Slava:

これは、最初からファイブにあった行動です。

バッファの再分配が原因でインジケータがクラッシュする例を挙げてください。

つまり、標準を超える1439本のバーが蓄積されたとき、ターミナルはバッファサイズをウィンドウ内の最大バーの値にリセットしなければならない(MUST)ことを確認しているのですね。もしYESの場合は、ドキュメントにその旨を記載する必要があります。これは予期せぬ動作であるため。

例の件ですが。棒グラフと連動したカスタム開発ということです。例:バー番号6438を記憶し、2分後(M1 TF)バッファが再分配され、アレイから抜けました。今では、これが「標準的」な行動であることは明らかです。ドキュメントの更新をお願いします。

 

実行中にエラーが発生しました。

class A { public:
        virtual void f( int = 0 ) { Print( 1 ); }
};
class B : public A { public:
        virtual void f( int     ) { Print( 2 ); }
};
void OnStart()
{
        B b;
        b.f();
}

結果:1

期待値: 2 または (C++ のように) - コンパイルエラー

 
Alexey Kozitsyn:

ドキュメントの更新をお願いします。

ドキュメントの更新が必要な箇所は?

バーを明確に識別するのは、昔からバー・ナンバーではなくバー・タイムである。

もし誰かがあなたのチャートにChartSetSymbolPeriodを呼び出したら、あなたは簡単にバーの数の変化をキャッチすることができます。サプライズ?

ちなみに、OnCalculateには、rates_totalというパラメータがあります。