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

 
Alexey Navoykov:

だから、MQLコンパイラは私が思っていたほど賢くないのだと、後悔しているところです)。簡単な例を作ってみたところ、どこにも使われない、何もしないダミーオブジェクトを作っても、コンパイラはそれを気にしないことが判明しました。全く最適化されていない。スピードだけで判断しています。そして、なぜか新しいビルドでは古いビルドより動作が遅くなる。

開発者も承知して います。しかし、このようなコンパイラによる最適化は、解決すべき課題の優先順位とはかけ離れている。

このような コンパイラの曖昧さもある。

 
fxsaber:

開発者も承知して います。しかし、このようなコンパイラによる最適化は、解決すべき課題の優先順位からは程遠い。

そうなんですが、さっきここであれだけオプティマイザーの質をかつてないほど高めたと自慢しておきながら、実はそんな簡単なことすら処理できていないというのが、なんとも不思議なんですよね。もっと複雑なものはおろか

 
fxsaber:

そこで、OnTesterInitにデフォルトのパステーブルを変更する可能性を追加することを提案します。

int PassesSet( const int Index, const MqlParam& Parameters[] );

パラメータセット自体はシステムに保存されておらず、組み合わせの固有番号(現在はパス番号と一致)により計算されていると推測されます。したがって、組み合わせの順番を変えることはできても、構成を変えることはできないのです。つまり、この場合、SwapPasses(long index1, long index2)のようなものになります。

でも、間違っているかもしれない。

 
Alexey Navoykov:

パラメータセット自体はシステムに保存されておらず、固有の組み合わせ番号(現在はパス番号と一致している)を使って計算されていると推測されます。したがって、組み合わせの順番を変えるだけで、その構成は変えられません。すなわち、この場合、SwapPasses(long index1, long index2)のようなものになります。

ということになるのかもしれません。これで、EAソースのSwap入力行によって、まだ何らかの影響を受ける可能性があります。

 
fxsaber:

ということになるのかもしれません。これで、EA のソースコードにある入力行の入れ替えで、順番がどうにかなりそうです。

最適化アルゴリズムを殺してしまう、つまりランダムな方向で最適化するようなものです。

 
Stanislav Korotky:

これでは最適化アルゴリズムが死んでしまいます。ランダムな方向に最適化するようなものです。

そもそも、完全にオーバーシュートしているという話です。

 

私は徐々にOOPを学んでいますが、1つだけ明白でないことに出くわしました。

クラスAがあり、そのフィールドは別のクラスBのオブジェクトである。

クラスAでは、クラスBのオブジェクトを返す定数メソッドが 呼び出されます。

その後、クラスBのメソッドが呼び出され、返されたオブジェクトのパラメータが削除されます。

こんな感じです(例はブラウザで書いたもので簡略化しています)。

class B
{
private:
   int m_width;
   int m_length;
public:
   void Reset() { m_width = 0; m_length = 0; }
}
class A
{
private:
   B m_member;
public:
   B GetBMember() const { return( m_member ); }
}
//---
A obj;
obj.GetBMember().Reset();

その結果、Reset()が動作しない、つまりm_memberフィールドがクリアされない。

質問:コンパイラはビルド時に定数オブジェクトの定数でないメソッドが呼び出されていることを報告(エラー/警告)するべきではないでしょうか?

 
Alexey Kozitsyn:

質問:コンパイラはビルド時に、定数オブジェクトに対して定数でないメソッドが呼び出されていることを報告(エラー/警告)するべきではないでしょうか?


おそらく、一時的なオブジェクトに対してResetが 呼び出された結果、暗黙のうちにコピーコンストラクタが呼び出されたことが原因だと思われます。

 
Sergey Dzyublik:

おそらく、一時的なオブジェクトに対してResetが 呼び出された結果、暗黙のうちにコピーコンストラクタが呼び出されたことが原因だと思われます。

ありがとうございます。おそらくその通りで、const指定は結果に影響しません(const指定がある場合もない場合もリセットは発生しません)。
 
Alexey Kozitsyn:

私は徐々にOOPを学んでいますが、1つだけ明白でないことに出くわしました。

クラスAがあり、そのフィールドは別のクラスBのオブジェクトである。

クラスAでは、クラスBのオブジェクトを返す定数メソッドが 呼び出されます。

その後、クラスBのメソッドが呼び出され、返されたオブジェクトのパラメータが削除されます。

こんな感じです(例はブラウザで書いたもので簡略化しています)。

その結果、Reset()が動作しない、つまりm_memberフィールドがクリアされない。

質問:コンパイラはビルド時に定数オブジェクトの定数でないメソッドが呼び出されていることを報告(エラー/警告)すべきではないでしょうか?

ポインターを返す。
class B
{
private:
   int m_width;
   int m_length;
public:
   void Reset() { m_width = 0; m_length = 0; }
}
class A
{
private:
   B m_member;
public:
   B * GetBMember() const { return( & m_member ); }
}
//---
A obj;
obj.GetBMember().Reset();