PLOです。アプリケーションの問題 - ページ 14

 
Yedelkin:

"無効なポインタへのアクセス" =="無効なポインタへのアクセスを試みている"?はい」の場合

次のような場合、ポインタは無効と なることがあります。

  • ポインタがNULL である。
  • オブジェクトがdelete 演算子で削除された場合。

1件目は私の場合です。

CheckPointer()などのチェックメソッドが使えれば嬉しいのですが(朝飯前)、チャートからEAを引き裂くのは、私には無理です。

つまり、コンストラクタでポインタをNULL に指定し、そのポインタを使ったアクションを停止すると、Expert Advisor は 281 を取得して終了します(私の考えによれば、終了しないはずなのですが)。

しかし、コンストラクタの後にInitまたはInitXXXを 呼び出すと(CExpertと 同様) 、すべてが適切に動作します...

 
Interesting:

最初の選択肢は、私の場合です。

CheckPointer() などのチェックメソッドが使えれば嬉しいのですが(同じ日に生まれたので)、チャートからEAをクラッシュさ せると、その機会がありません。

もし私がコンストラクタでポインタがNULL と等しいことを指定し、それで可能なすべての動作を中断すると、EA は 281 を取得して終了します(そして私の考えによれば、そうすべきではない)。

しかし、コンストラクタ(CExpertと同様) の後にInit または InitXXX を呼び出すと、すべてが正しく動作します...。


例外処理をしていれば、何が問題なのかを簡単に把握し、解決することができたのです。
 
Interesting:

最初の選択肢は、私の場合です。

CheckPointer()などのチェックメソッドが使えれば嬉しいのですが(昨日にない生まれだと思います)、チャートからEAを引き裂くのは私にチャンスを与えてくれないのです。

つまり、コンストラクタでポインタをNULL に指定し、そのポインタを使ったアクションを停止すると、Expert Advisor は 281 を取得して終了します(私の考えによれば、終了しないはずなのですが)。

コンストラクタ(CExpertと同様)の後にInitまたはInitXXXを 呼び出すと、 、すべてが正常に動作するようになります...。

InitやInitXXXメソッドはまだ扱っていませんが、「EAが引き下げられる」こと自体は、「実行 時のプログラムが不正なポインタにぶつかり、このボトルネックをコードの中から探さなければならない」と解釈しています。私のコンストラクタもポインタをNULLに初期化しますが、何も飛んできません。

質問の意味が違っていたら、ごめんなさい。

 
Interesting:

ありがとうございます。これですべてのものが定位置に収まりました。エラー281が 発生したが、EAがアンロードされないことが望ましいとする。どのように扱えばいいのでしょうか?

初期化のすべてのステップの後にエラー 281 が発生したが、Expert Advisor の主要な作業に致命的な影響を与えず、まったく実行しない場合はどうすればよいですか。

例外処理は行わない。

解決策はただ一つ、不正なポインタを使用しないことです。

ポインタが正しくない可能性がある場合(ゼロではない)、使用前に必ず確認してください。

 
uncleVic:

例外処理は行わない。

唯一の解決策は、無効なポインタを使用しないことです。

ポインタが不正確である可能性が(ゼロではない)場合、使用前に必ずテストしてください。


ポインタが無効である可能性は(ゼロ以外では)常にあります

そのため、使用する前に必ず有効性を確認する必要があります。天地創造後だけでなく

常にではありませんが、重要なポイントではそうしています :(


あなたの推薦を使うと、なんと純粋な透明コードが :) 化けるのでしょう。

 
Yedelkin:

InitやInitXXXメソッドはまだ扱っていませんが、「EAをチャートから外す」こと自体は、「実行 中のプログラムが不正なポインタにぶつかり、まさにこのボトルネックをコードの中から探さなければならない」と解釈します。私のコンストラクタもポインタをNULLに初期化しますが、何も飛んできません。

質問を誤解していたのなら、ごめんなさい。

CExpertクラス であれば、少なくともInit(...)を呼び出さなければなりません。そこにあるすべてのポインターは、基底クラスのオブジェクトへのポインターとして初期化されます...
 
falkov:

ポインタが無効である可能性は常にあります(ゼロではありません)。

そのため、使用する前に必ず有効性を確認する必要があります。

常にではありませんが、重要な分野ではそうしています :(


あなたの推薦を使用すると、純粋な透明なコードがなんと :) 変わってしまうのでしょう。

代替案: 無効なポインターで 飛ぶ、きれいで透明なコードを持っていますか?
 
uncleVic:
代替案: 無効なポインターで飛んでしまう、クリーンで透明なコードをお持ちですか?

代替案:クリーンで透明性のあるコードを持つ。

無効なポインタと他の例外的な状況(電源障害、ディスク容量、など排他的な状況)で、プログラムは例外処理ブロックに移動し、尊敬される興味深い(そして私も:)変数値とエラーを表示し、状況を分析し、問題が何であるかを理解することができました。そして、このブロックで起こったことに反応がなければ、ドロップアウトする。

もちろん、標準的で必要なチェックが無効になるわけではありません。これは、例外的な状況においてのみ適用されます。

 
uncleVic:
CExpertクラスであれば、少なくともInit(...)を呼び出す必要があります。そこにあるすべてのポインターは、基底クラスのオブジェクトへのポインターとして初期化されます...

例えば、InitやInitXXXがエラー(falseを返す)で実行された場合、その後どうなるのでしょうか?

また、実行時にEAが281を受信しているにもかかわらず、周りにトレーダーがいない場合はどうしたらよいでしょうか。

それは仕方が ないことです。

例外処理をしていれば、何が問題なのかを簡単に把握し、対処することができたのです。

チェックはほぼ全工程で行っているのですが、残念ながら処理が追いつきません...。

追記

そこで、EAがチャートから脱落することについてですが、どのような初期化でもEAを「生かす」ためには、どうしたらよいのでしょうか?

 
uncleVic:
代替案: 無効なポインタによってクラッシュする、きれいで透明なコードを持つには?

まあ、それはそれで、専門家を引きずり下ろすかどうかは、この際「私」自身に判断させなさいということで飛んでいくわけです。

結局のところ、「壊れた」ポインタがどこかに適用されるという話でもないのですが、個人的には適用前のチェックはしています(タイマで別のチェックを実装することは可能ですが)。

指標とはどうにか共存できるようになったし、初期化の結果もあまり気にならないのだが、ポインタとは友達になれない。

イェデルキン

InitやInitXXXメソッドはまだ扱っていませんが、「EAダンピング」を解釈すると、実行 時にプログラムが不正なポインタにぶつかり、このボトルネックをコード内で探さなければならない、ということです。私のコンストラクタもポインタをNULLに初期化しますが、何も飛んできません。

もし私が質問を誤解していたのなら、申し訳ありません。

現在、問題を解決するために、私は初期化ブロックで0を返しています。

int OnInit()
{
//----------------------------------------------------------------------------//

//Processing process of the initialization

//----------------------------------------------------------------------------//
return(0);
//----------------------------------------------------------------------------//
}

私の理解では、それが私にとって最良の方法です(EAが初期化時にクラッシュしないように)。I.e.どのような場合でも結果OnInit = 0 であれば、どの程度正しいのか判断できない。