mql5言語の特徴、微妙なニュアンスとテクニック - ページ 227

 
fxsaber #:
興味深い結果だ。

まだ修正されていないのが不思議だ:

取引、自動取引システム、取引戦略のテストに関するフォーラム

バグ、バグ、質問

A100, 2020.08.01 05:42

実行中のエラー
template<typename T>
void f( T ) { Print( __FUNCTION__); }
void OnStart()
{
        {
                f<ulong>( 1 );
        }
}

Result: OnStart::unnamed#00000216656562DC80::f<ulong>

期待される結果: OnStart::f<ulong>


 
fxsaber #:
コンパイラの制限。

これは明らかな欠陥であり、コンパイラはもうこのようなコードに医療チームを呼ぶべきだと思う。

ネストされたマクロに括弧を入れることは仮に可能だが、中括弧を入れることはできない。
 
構造体/クラスオブジェクトのフィールドの初期化の順序が、コンストラクタの後のエントリではなく、フィールドの相互の配置に依存する場合、これが正しい動作かどうかアドバイスしてください。
struct A
{
  int Count;
  
  A() : Count(0) {}
};

struct B : public A
{
  int i, j; // Единственная строка, отличающая от C.

  B() : i(this.Count++), j(this.Count++) {}
};

struct C : public A
{
  int j, i; // Единственная строка, отличающая от B.

  C() : i(this.Count++), j(this.Count++) {}
};

void OnStart()
{
  B b;  
  Print(b.i); // 0
  Print(b.j); // 1

  C c;
  Print(c.i); // 1
  Print(c.j); // 0
}

期待されていたのは、コンストラクタで指定されたとおりに左から右へ初期化することでした。

C() : i(this.Count++), j(this.Count++) {}

しかし、初期化はフィールドごとに上から下へと進むことが判明した。そして、コンストラクタの後に指定された初期化の順序は重要ではないことがわかった。これは正しいのだろうか?

 
fxsaber #:
構造体/クラスオブジェクトのフィールドの初期化の順序が、コンストラクタの後のエントリではなく、フィールドの相互の配置に依存する場合、これが正しい動作かどうかアドバイスしてください。

コンストラクタで指定されたとおりに左から右へ初期化することを期待していました。

しかし、初期化はフィールドごとに上から下へと進むことが判明した。そして、コンストラクタの後の初期化の指定された順序は重要ではありません。これは正しいのでしょうか?

どうせ誰も読まないのに、なぜ開発者はこんなに詳細なヘルプを 書くのでしょうか?フォーラムで質問してください - 彼らが助けてくれます!

 
A100 #:

どうせ誰も読まないのに、なぜ開発者はこんなに詳しいヘルプを 書くのだろう?フォーラムで質問してください!

ヘルプで質問の答えを見つけるスキームが明確になれば、フォーラムのヘルプに頼ることは少なくなるだろう。

 
fxsaber #:

ヘルプで答えを見つけるという図式が理解できれば、フォーラムを利用する頻度は減るだろう。


データ型」→「構造体とクラス」。

初期化リストでは、メンバはどのような順番でも構いませんが、すべてのクラスメンバは宣言された順番に従って初期化されます。
 
Sergey Gridnev #:

データ型" -> "構造とクラス"

初期化リストでは、メンバはどのような順番でも構いませんが、すべてのクラス・メンバは宣言された順番に従って初期化されます。

ありがとうございます。残念ながら、どこをどのように見ればいいのか、必ずしも明確ではありません。

 
fxsaber #:

ありがとう。残念なことに、どこをどう見ればいいのか、必ずしも明確ではないんだ。

そうですね。
 


イベントがタイマー動作をブロックする。
Expert Advisorにはそんなものはない。
安定したタイマー動作が必要なインジケーターを使うのは意味がないと改めて確信した。これは特にレスポンシブ・インターフェースに当てはまります。

この問題を実証するインジケーターがこちらです。タイマーは20ミリ秒に設定され、タイマーイベント間の時間が100ミリ秒を超えると表示されます。

#property indicator_chart_window
//+------------------------------------------------------------------+
int OnInit()
  {
   EventSetMillisecondTimer(20);
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const int begin,
                const double &price[])
  {
   return(rates_total);
  }
//+------------------------------------------------------------------+
void  OnTimer()
  {
   static uint last_time = GetTickCount();
   uint cur_time = GetTickCount();
   if (cur_time-last_time>100) Print(string(cur_time-last_time)+" ms");
   last_time = cur_time;
  }
//+------------------------------------------------------------------+



 
追加しました。
template <typename T>
class A
{
public:  
  void f() const { ::Print(typename(T)); }
};

void OnStart()
{
  const A<MqlTick> a;
  
  a.f(); // struct MqlTick
}
理由: