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

 
Zeleniy:

最適化がうまくいっていない。

2014.08.05 19:34:42 Tester no optimized parameter selected, please check input(s) to be optimized and set carefully start, step and stop values.

翻訳では何も出なかった。

"何もない "とはどういう意味ですか?翻訳では、最適化のために少なくとも1つのパラメータを選択し、開始、終了、ステップの値が正しいことを確認しなければならない、というようなことが書かれていたはずです。
 
marketeer:
"何もない "とはどういう意味だ?翻訳では、最適化のために少なくとも1つのパラメータを選択すること、テストの開始、終了、ステップが正しいことを確認すること、などの説明があったはずです。
変な話、何もわからない、疲れているのかもしれない、2日目もエラーに悩まされる。ありがとうございます、お言葉を頼りにしていきます。
 

同じクラスの2つのオブジェクトを比較する必要があり、便利なように演算子==をオーバーロードすることにしました。 しかし、オブジェクトが動的である場合、私の演算子は実行されず、オブジェクト自体の代わりにポインタが比較されることが判明しました。まあ、原理的には、*a == *bというように、ポインタでオブジェクトにジャンプする操作が必要なのですが、MQLはその可能性を提供することを忘れています。追加する必要があります。

class T {   int x;

public:

T (int value) { x=value; }   bool operator==(T& other) { Print("compare1");  return x==other.x; }   bool operator==(T* other) { Print("compare2");  return x==other.x; } }; //------------------ void OnStart() {   T* a= new T(10);   T* b= new T(10);      Alert(a==b);      delete a;   delete b; }

 

今思ったのですが、オブジェクトではなくポインタを比較するというのは、言語の仕様を考えると根本的に間違っています。 結局のところ、MQLはマネージド言語であり、ここではオブジェクトの格納方法やアクセス方法に関係なく「オブジェクト」という概念そのものが使われているのです。メンバーやメソッドへのアクセスは、どのような場合でもドットで行います。また、ポインタの比較が必要な場合は、GetPointer() を使用する必要があります。

 
meat:

今思ったのですが、オブジェクトそのものではなく、ポインタの比較があるというのは、言語の仕様からして根本的に間違っていますね。

他の手段でできるのであれば、C++と矛盾する比較ルールをMQLで作る必要はない。ポインタがあり、オブジェクトを比較する必要がある場合は、比較関数を使用します。
bool Compare(const T& t1, const T& t2 ) { return ( t1 == t2 ); }

Alert( Compare( a, b ));
(*a == *b)という形式のレコードを許可することと、(a == b)というレコードに別の意味を持たせることは全く別物です。
 

Expert Advisorをテスト すると、エラーが発生する

OrderSend 関数の無効なテイクプロフィット

OrderSend エラー 4107

コードに触れずに修正するにはどうしたらよいですか?

 
A100:
他の手段が使える以上、C++と矛盾するような比較ルールをMQLで考案する必要はない。ポインタがあり、オブジェクトを比較する必要がある場合は、比較関数を使用します。 (*a == *b) のエントリを許可することを提案することと、(a == b) のエントリに異なる意味を与えることは、まったく別のことです。

MQLのルールがC++のルールと矛盾していることを説明しています。 C++のルールに従えば、ポインタによるオブジェクトの参照は -> であるべきですが、ここではドットで行われています。

つまり、C++では「ポインタ」と「オブジェクト」は全く別の概念で、だから構文も違う。 すべてが厳密だ。 しかし、ここではすべてが混同されている。 まるで、ポインタのプロパティとメソッドを扱っているように見えるのである。それが悪いとは言いません。OOPではその方が便利ですし、例えばC#ではそうなっています。 しかし、そうすると、他のものもすべて同じように実装しなければなりません。 コンセプトは1つでなければなりません。 そうしないと、ある場合にはポインタをオブジェクトそのものと同じように使い、ある場合にはポインタが突然生き返ったりして矛盾や混乱が生じてしまうのです。

その結果、比較や代入の動作が変わってしまうという問題が発生しました。そして、この問題は、プログラムがコンパイルされ正常に動作し続けるものの、本来の動作には至らないため、発見することが困難でした。

 

私のコードには、あるオブジェクトを含むクラスがあります。

CClass
{
  ...
  CObj  Object; 
  ...
};

CObjクラスは、その前に宣言されています。

コンパイルしようとすると、次のようなエラーが発生します: 'Object' - cannot be unset

このエラーの意味と原因は何ですか? 以前、このエラーに遭遇した覚えはありません。 CObjクラスには、コンストラクタとデストラクタがあります。

Objectを単純に変数として 宣言してみたところ、すべてOKでした。 しかし、それがクラスの一部である場合は、そうはいきません。

 
このエラー("- cannot be unset")が何なのか、どなたか説明してください。 いつ発生するのでしょうか?
 
meat:
このエラー("- cannot be unset")が何なのか、どなたか説明してください。 いつ発生するのでしょうか?
このオブジェクトにはZeroMemory 関数は 使用できません。