CGraphicのテスト - 質問と提案 - ページ 10

 

トレーディング、自動売買システム、ストラテジーテストに関するフォーラム

初心者からのFAQ MQL5 MT5 MetaTrader 5

アレクセイ・ヴャズミキン, 2019.02.17 06:56

私はもう一度実験を繰り返すことにしました、以下はそのコードです。

      //--- отключим показ ценового графика
      ChartSetInteger(0,CHART_SHOW,false);
      long chart=ChartID();

      CGraphic graphic;
         Print("0 Тут ошибка ",GetLastError()," ",cLng::CodeDescription(GetLastError()));
         ResetLastError();
      if(ObjectFind(chart,name)<0)
        {
         Print("1 Тут ошибка ",GetLastError()," ",cLng::CodeDescription(GetLastError()));
         ResetLastError();
         graphic.Create(chart,name,0,0,0,pix_X,pix_Y);//Создает графический ресурс, привязанный к объекту чарта 
         Print("2 Тут ошибка ",GetLastError()," ",cLng::CodeDescription(GetLastError()));
         ResetLastError();
        }

そして、その結果がこちらです。

2019.02.17 08:55:19.845 Test_4G_CB (Si Splice,H1)       0 Тут ошибка 0 Операция выполнена успешно
2019.02.17 08:55:19.860 Test_4G_CB (Si Splice,H1)       1 Тут ошибка 4202 Графический объект не найден
2019.02.17 08:55:19.860 Test_4G_CB (Si Splice,H1)       2 Тут ошибка 4202 Графический объект не найден
エラーの原因に心当たりはありますか?
ライブラリの中にエラーがあるとのことですが、直るのでしょうか?
 
Aleksey Vyazmikin:
ライブラリに誤りがあるとのことですが、訂正されますか?

テレパスは休暇中です。そして、普通の人々のために私たちは必要です。

  1. 問題を再現する最小限のコード(不要なゴミをすべて取り除いたもの)。
  2. 何が問題なのかの明確な説明(何を得たいのか、何が得られたのか、なぜそれがバグだと思うのか)。
  3. オペレーティングシステム仕様、ターミナルビルド、トレードサーバー名

 
Aleksey Vyazmikin:
ライブラリに誤りがあるとのことですが、訂正されますか?

どこでエラーになったと言われたのですか?私はあなたに言った - ライブラリで_LastError変数に書き込まれる可能性がある点を探してください。必ずしも、エラーのあるコードが動作したわけではありません。なぜなら、オブジェクトを検索して(存在しない場合はエラーコードを 変数に書き込む)作成する可能性があるからです。しかし、オブジェクトが作成されない場合はエラーになりますが、作成され、すべてがうまくいきます。しかし、チェックした結果、エラーコード(オブジェクトが生成前に存在しなかった)が変数に書き込まれ、それをコードで読み取ることになります。

 
Vladimir Karputov:

テレパスはお休みです。普通の人に必要なのは

  1. 問題を再現する最小限のコード(不要なゴミをすべて取り除いたもの)。
  2. 何が問題なのかを明確に説明すること(何を得たかったのか、最終的に何を得たのか、なぜそれがエラーだと思うのか)。
  3. オペレーティングシステム仕様、ターミナルビルド、トレードサーバー名

1.コード

//+------------------------------------------------------------------+
//|                                              CB_Model_Analiz.mq5 |
//|                        Copyright 2016, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#include <Graphics\Graphic.mqh>
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   string name="Name";
   long chart=ChartID();

   CGraphic graphic;
   Print("0 Тут ошибка ",GetLastError());
   ResetLastError();
   if(ObjectFind(chart,name)<0)
     {
      Print("1 Тут ошибка ",GetLastError());
      ResetLastError();
      graphic.Create(chart,name,0,0,0,100,100);//Создает графический ресурс, привязанный к объекту чарта 
      Print("2 Тут ошибка ",GetLastError());
      ResetLastError();
     }
   graphic.Destroy();
  }
//+------------------------------------------------------------------+

2.ログにエラーメッセージを 期待しない

2019.02.17 10:37:46.326 CB_Model_Analiz (Si Splice,H1)  1 Тут ошибка 4202
2019.02.17 10:37:46.326 CB_Model_Analiz (Si Splice,H1)  2 Тут ошибка 4202

3.Windows 7 Home 32bit、ビルド1940、テスト中はサーバーに接続しない - ブローカー発見。

 
Artyom Trishkin:

どこでエラーと言われたのですか?私はあなたに言った - それが_LastError変数に書き込まれる可能性があるライブラリの断片を探します。必ずしも、エラーのあるコードが動作したわけではありません。なぜなら、オブジェクトを検索して(存在しない場合はエラーコードを 変数に書き込む)作成する可能性があるからです。しかし、オブジェクトが作成されない場合はエラーになりますが、作成され、すべてがうまくいきます。しかし、チェックした結果、エラーコード(オブジェクトが生成前に存在しなかった)が変数に書き込まれ、それをコードで読み取ることになります。

ライブラリは、実際にエラーがあるときにエラーを発生させるか、または状況を正しく処理し、エラーがないときにはエラーを発生させないようにしなければなりません。エラーチェックの際に、私のライブラリの使い方がクラスに記述されていない場合は、それを指定する必要があります。何はともあれ、製品のメーカーライブラリーをユーザーが編集するのは不合理です。

 
Aleksey Vyazmikin:

ライブラリは、実際にエラーがあるときにエラーを発生させるか、または状況を正しく処理し、エラーがないときにはエラーを発生させないようにしなければなりません。エラーチェックの際に、私のライブラリの使い方がクラスに記述されていない場合は、それを指定する必要があります。何はともあれ、製品のメーカーライブラリーをユーザーが編集するのは不合理です。

そこに間違いはありません、もう一度読んでみてください。

どこでエラーと言われたのですか?私はあなたに言った - それが_LastError変数に書き込まれる可能性があるライブラリの断片を探します。必ずしも、エラーのあるコードが動作したわけではありません。なぜなら、 オブジェクトを検索して存在しない 場合は エラーコードを 変数に書き込む)作成する可能性が あるからです。しかし、オブジェクトが作成されない場合はエラーになりますが、作成され、すべてがうまくいきます。しかし、チェックの結果、エラーコード(オブジェクトが生成前に存在しなかった)が変数に書き込まれ、それをコードで読み取ることになります。

ですから、コードが正常に実行された後に、なぜエラーを読んだのか、それはあなたの興味だけなのです。最も理解していないのは、変数_LastErrorに0以外のコードがあっても、必ずしもCGraphicのコードにエラーがあることを意味せず、それだけではない、ということでしょう。この場合、SBのCGraphic内部で実行された、オブジェクトの存在を検索した単純な結果である可能性があります。名前によるオブジェクトの要求があり、結果は -1 を返し、コード 4202 が _LastError に書き込まれました。そして、オブジェクトが作成され、すべてが動作し、呼び出し元のプログラムに戻されました。そしてそこですぐにエラーコードを 読み取り、取得するのです。しかし、エラーはありません。SB内部でクエリの結果を見ることができます。

私は、あなたが報告していることについて、考えられる理由を提案しているだけです。

ですから、本当に本当のエラーを発見して報告したいのであれば、エラーコードを読んだから-間違いなくあると主張するのではなく、デバッガでCGraphicのコードを全部調べて、ロジックや性能に不具合が生じる本当のエラーをキャッチする必要があるのです。

 
Artyom Trishkin:

そこに間違いはありません、もう一度読んでみてください。

ですから - 正常なコード実行の後になぜエラーが表示されるのかを知ることは、あなたの関心事であるに過ぎません。変数_LastErrorの内容が0でないからといって、必ずしもCGraphicのコードにエラーがあるわけではない、ということはご理解いただけないかと思います。この場合、SBのCGraphic内部で実行された、オブジェクトの存在を検索した単純な結果である可能性があります。名前によるオブジェクトの要求があり、結果は -1 を返し、コード 4202 が _LastError に書き込まれました。そして、オブジェクトが作成され、すべてが動作し、呼び出し元のプログラムに戻されました。そしてそこですぐにエラーコードを 読み取り、取得するのです。しかし、エラーは全くなく、SB内部のクエリの結果が表示されます。

私は、あなたが報告されたことについて、考えられる理由を提案しただけです。

ですから、本当に本当のエラーを発見して報告したいのであれば、「エラーコードを読んだから-間違いなくある」と主張するのではなく、デバッガでCGraphicのコードを全部調べて、ロジックや動作に不具合が生じる本当のエラーをキャッチする必要があるのです。

あなた自身が論理的推論で「コードに誤りがある可能性がある」と言い、それがエラーをリセットしないことで表現されています。 作成前のオブジェクトがないために受けた

いや、複雑なコードの中からエラーを探し、そのように意図されていたという答えを導き出す力量は私にはない。

このメッセージはユーザーエラーなのか、そうでないのかを教えてください。

2019.02.17 11:08:42.901 Test_4G_CB (Si Splice,H1)       invalid pointer access in 'Test_4G_CB.mq5' (909,7)

これを指し示すコードは、D.PointsFill(false)です

      CCurve *D=graphicT.CurveAdd(X_04,Y_04,ColorToARGB(DarkOrange,256),CURVE_POINTS,Interval_04);//Создает и добавляет кривую на график
      D.PointsFill(false);//Устанавливает флаг, указывающий, нужно ли выполнять заливку для точек, определяющих кривую при отрисовке точками. 
      D.PointsType(POINT_VERTICAL_DASH);//Устанавливает флаг, указывающий на тип точек, использующихся при отрисовке кривой точками.
 
Aleksey Vyazmikin:

あなた自身が論理的推論でコードに誤りがある可能性を指摘し、エラーをリセットしないことでそれを表現しています。 作成前のオブジェクトが存在しないために受けた

いや、複雑なコードの中からエラーを探し、そのように意図されていたという答えを導き出す力量は私にはない。

このメッセージはユーザーエラーなのか、そうでないのかを教えてください。

D.PointsFill(false)というコードを指しています

この言葉の意味が全く理解できない。

もう、すべて詳しく説明したようなものです。

どうだろう。あまり情報がない。

 
Artyom Trishkin:

この言葉の意味が全く理解できない。

もう、すべて丁寧に説明したように思います。

どうだろう。あまり情報がない。

もし、あなたのコードがエラーに反応するように作られているならば(エラー時にオブジェクトを作成する)、エラーを修正(オブジェクトを作成)した後、このエラーをリセットするのが論理的であり、あなたの論理的推論によれば、それはライブラリで行われていないことが理解できないのでしょう。

また、このエラーにどう対処したらいいのか、情報がないのです...。

 
Aleksey Vyazmikin:

エラー対応(エラーの場合はオブジェクトを作成する)でコードが作られているのであれば、エラー訂正(オブジェクト作成)の後、このエラーをリセットするのが論理的であり、あなたの論理理屈ではライブラリで行われないことが理解できないのでしょう。

ここで、このエラーに対応するための情報がないのですが...。

0に等しくない_LastErrorのコードがエラーになるのではなく、この関数が返す結果が、この関数の実行の誤りを示していることをよく理解しておく必要があります。そして、_LastErrorには、関数が誤って実行される原因となったそのエラーを正確に指し示すコードが含まれています。ですから、関数の戻りコードを直接使うのではなく、サービス変数に格納されているエラーコードの記述を使うというのは疑問です。関数が -1 か false か 0 を返した場合(各関数のエラーコードはヘルプに記載されています)、まあ - 関数が返す結果の分析だけがあなたによって処理されるべきで、_LastError のコードはエラーを示しませんが、関数が返す結果の原因を示すために使用されます。

オブジェクト検索機能は、与えられた名前のオブジェクトが存在しない場合、0より小さい値を返す。エラーなのでしょうか?いいえ、これは関数の標準的な応答で、与えられた名前のオブジェクトを作成するかどうかを判断するためのものです。LastErrorに含まれるコードは、「要求された名前のオブジェクトが存在しない」ことを明示的に示しています - あなたはそれを作成することができます。

まあ、説明するのも疲れるんだけどね。欲しい人は、きっとわかってくれる。