测试CGraphic--问题和建议 - 页 10

 

关于交易、自动交易系统和策略测试的论坛

初学者的常见问题 MQL5 MT5 MetaTrader 5

Aleksey Vyazmikin, 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 32位,build 1940,测试期间未连接到服务器--经纪人发现。

 
Artyom Trishkin:

你在哪里被告知有一个错误?我告诉过你--在库中寻找一个片段,它可能被写入_LastError变量。这不一定是有错误的代码已经工作了。因为它可能会搜索一个对象(如果没有,错误代码 将被写入变量)并创建它。但如果对象不会被创建,那就是一个错误,但它会被创建,一切都会成功。但在检查后,错误代码(对象在创建前不存在)将被写入一个变量,然后你在代码中读取。

库必须在有实际错误时产生一个错误,或者正确处理这种情况,在没有错误时不产生错误。如果我对库的使用在检查错误时没有在类中描述,你应该指定它。无论如何,用户编辑产品的制造商库是不合理的。

 
Aleksey Vyazmikin:

库必须在有实际错误时产生一个错误,或者正确处理这种情况,在没有错误时不产生错误。如果我对库的使用在检查错误时没有在类中描述,你应该指定它。无论如何,用户编辑产品的制造商库是不合理的。

那里没有错误,再读一遍。

你在哪里被告知有一个错误?我告诉过你--在库中寻找一个片段,它可能被写入_LastError变量。这不一定是有错误的代码已经工作了。因为它可能会搜索一个对象如果没有,错误代码 将被写入变量)并创建它。但如果对象不会被创建,那就是一个错误,但它会被创建,一切都会顺利进行。但在检查后,错误代码(对象在创建前不存在)将被写入一个变量,然后你将在你的代码中读取。

所以你只需要知道为什么你在代码正常执行后读到了错误。你很可能不明白的是,在_LastError变量中出现0以外的代码,并不一定意味着CGraphic的代码中存在错误,而不仅仅是它。在这种情况下,它可能是搜索一个对象存在的简单结果,该对象在SB的CGraphic内执行。有一个按名称请求的对象,结果返回-1,代码4202被写进_LastError。然后该对象被创建,一切正常,并被返回到调用程序。而在那里,你立即阅读错误代码 并得到它。但是没有错误--你在SB里面看到了查询的结果。

我只是为你所报告的情况提出了一个可能的原因。

因此,如果你真的想找到一个真正的错误并报告它,你需要在调试器中浏览整个CGraphic代码,并抓住会导致逻辑和性能故障的真正错误,而不是仅仅声称你读到了错误代码,因此--它肯定存在。

 
Artyom Trishkin:

那里没有错误,再读一遍。

所以--你只需要知道为什么你在正常的代码执行后会读到错误。你可能不明白,_LastError变量的内容不为零,并不一定意味着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:

你不明白,如果代码是建立在错误响应的基础上(在错误的情况下,我们创建一个对象),那么在错误纠正(对象创建)之后,重置这个错误是合乎逻辑的,根据你的逻辑推理,库中没有这样做。

在这里,我没有关于如何应对这个错误的信息......。

你必须清楚地知道,不是_LastError中不等于0的代码是错误的,而是由函数返回的结果指向这个函数的错误执行。而_LastError包含的代码正好指向那个导致函数错误执行的错误。所以,你可以使用存储在服务变量中的错误代码的描述,而不是直接使用函数的返回代码,这一点值得怀疑。如果函数返回-1或false或0(对于每个函数,其错误代码在帮助中都有描述),那么--只有对函数返回的结果的分析应该由你来处理,而不是_LastError中的代码,它并不表示错误,而是用来表示函数返回的某些结果的原因。

对象搜索函数在给定名称的对象不存在的情况下返回一个小于0的值。这是一个错误吗?不,这是一个函数的常规响应,在此基础上,你对创建一个具有给定名称的对象做出决定。包含在_LastError中的代码明确地说,"具有请求名称的对象不存在" - 你可以创建它。

好吧,我已经厌倦了向你解释。谁愿意,谁就会明白。