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

 
fxsaber:

2365 - コードにエラーが散見された。まだ、それを理解する時間がなかったのです。2361にロールバックしたところ、大丈夫でした。mq4では - 同じ状況です。

メッセージありがとうございます、確認します

 
MT5の新しいバージョン(ビルド2365)をダウンロードしたのですが、残念ながら何かが壊れているようです。
ベースクラスのコンストラクタを呼び出す際のパラメータ受け渡しに あるようです。
 
Sergey Dzyublik:
バグ番号: MT5 (build 2365) コンストラクタの引数に参照渡しのポインタを 使用した場合、代入演算子を使用したクラスへの 暗黙のコンストラクタ 呼び出しでコンパイルエラーが発生します。
参照渡しのポインタが値渡しに置き換われば、すべてがうまくいく。

投稿ありがとうございます、修正しました

 

MT5 (build 2365) のバグで、テンプレートクラスのテンプレートパラメータがベースクラスとして使用されている場合、ベースクラスのコンストラクタを 呼び出すとコンパイルエラーが発生します。
MT5(build 2363)では問題ありません。

class B;

template<typename T>
class A : public T{
public:
   A() : T(){}   // 'B' - identifier expected
};


class B{};

void OnStart(){
   A<B> a;
};
 
Ilyas:
オブジェクトに対するArrayResizeが高速化されたことがわかります。
再び、ArrayResize関数の1部分の複雑さが対数からゼロになりました

予約メモリに対するArrayResizeの 高速化、どうもありがとうございました。
MT5 (build 2365)の実プロジェクトでstd::vector::push_backが以前のビルドより1.5倍高速化されました。
また、std::vector:resizeのラグが2.2倍から1.45倍に減少しています。

 

build 2366、定数が正しく動作しなくなった気がします。

class A
{
private:
   int               f1(){Print(__FUNCTION__); return(1);}
   int               f2(){Print(__FUNCTION__); return(2);}
public:
   int               func(int v){const int a = f1(); const int b = f2(); return(a+b+v);}
};

A a1,a2;
//+------------------------------------------------------------------+
void OnStart()
{
   Print("1. ",a1.func(1));
   Print("2. ",a1.func(2));
   Print("3. ",a2.func(3));
   Print("4. ",a2.func(4));
}
//+------------------------------------------------------------------+

2020.03.21 12:55:59.904 tst (EURUSD,H1) A::f1

2020.03.21 12:55:59.904 tst (EURUSD,H1) A::f2

2020.03.21 12:55:59.904 tst (EURUSD,H1) 1.4

2020.03.21 12:55:59.904 tst (EURUSD,H1) A::f1

2020.03.21 12:55:59.904 tst (EURUSD,H1) A::f2

2020.03.21 12:55:59.904 tst (EURUSD,H1) 2.5

2020.03.21 12:55:59.904 tst (EURUSD,H1) A::f1

2020.03.21 12:55:59.904 tst (EURUSD,H1) A::f2

2020.03.21 12:55:59.904 tst (EURUSD,H1) 3.6

2020.03.21 12:55:59.904 tst (EURUSD,H1) A::f1

2020.03.21 12:55:59.904 tst (EURUSD,H1) A::f2

2020.03.21 12:55:59.904 tst (EURUSD,H1) 4.7

const を static に置き換えると、期待通りに動作します - a と b の初期化時に f1() と f2() を 1 回ずつ呼び出すだけです。

  int               func(int v){static int a = f1(); static int b = f2(); return(a+b+v);}

2020.03.21 12:58:03.496 tst (EURUSD,H1) A::f1

2020.03.21 12:58:03.496 tst (EURUSD,H1) A::f2

2020.03.21 12:58:03.496 tst (EURUSD,H1) 1.4

2020.03.21 12:58:03.496 tst (EURUSD,H1) 2.5

2020.03.21 12:58:03.496 tst (EURUSD,H1) 3.6

2020.03.21 12:58:03.496 tst (EURUSD,H1) 4.7

 

こんなコードを書いたら、完全にバグで捕捉されない

class A
{
private:
   int               f1()const {static int v1=1; Print(__FUNCTION__); return(v1++);}
   int               f2()const {static int v2=1; Print(__FUNCTION__); return(v2++);}
public:
   int               func(int v){const int a = f1(); const int b = f2(); return(a+b+v);}
};
 
Igor Makanu:

build 2366、定数が正しく動作しなくなった気がします。

2020.03.21 12:55:59.904 tst (EURUSD,H1) A::f1

2020.03.21 12:55:59.904 tst (EURUSD,H1) A::f2

2020.03.21 12:55:59.904 tst (EURUSD,H1) 1.4

2020.03.21 12:55:59.904 tst (EURUSD,H1) A::f1

2020.03.21 12:55:59.904 tst (EURUSD,H1) A::f2

2020.03.21 12:55:59.904 tst (EURUSD,H1) 2.5

2020.03.21 12:55:59.904 tst (EURUSD,H1) A::f1

2020.03.21 12:55:59.904 tst (EURUSD,H1) A::f2

2020.03.21 12:55:59.904 tst (EURUSD,H1) 3.6

2020.03.21 12:55:59.904 tst (EURUSD,H1) A::f1

2020.03.21 12:55:59.904 tst (EURUSD,H1) A::f2

2020.03.21 12:55:59.904 tst (EURUSD,H1) 4.7

const を static に置き換えると、期待通りに動作します - a と b の初期化時に f1() と f2() を 1 回ずつ呼び出すだけです。

2020.03.21 12:58:03.496 tst (EURUSD,H1) A::f1

2020.03.21 12:58:03.496 tst (EURUSD,H1) A::f2

2020.03.21 12:58:03.496 tst (EURUSD,H1) 1.4

2020.03.21 12:58:03.496 tst (EURUSD,H1) 2.5

2020.03.21 12:58:03.496 tst (EURUSD,H1) 3.6

2020.03.21 12:58:03.496 tst (EURUSD,H1) 4.7

これはまさに、あるべき姿です。

 
Igor Makanu:

こんなコードを書いたら、完全に検出不能なバグになる。

こちらもすべて正しいです。

 
Koldun Zloy:

これはまさに、あるべき姿です。

昨年はそのようにはいきませんでしたが、特別にconst修飾子をテストしました

で、@Ilyas さんが説明したMQLプログラムの実行方法は、まずconstとstaticがどこに記述されていてもすべて初期化され、その後クラスのコンストラクタが呼ばれるようです。

OK、この初期化 static / const で、まだ適切に配布することができます - しかし、const 修飾子は、コンパイラがこれをチェックすることを保証しないという事実は非常に予想外です - 私の第二の例

理由: