Prüfung von CGraphic - Fragen und Anregungen - Seite 10

 

Forum für Handel, automatisierte Handelssysteme und Strategietests

FAQ von Anfängern MQL5 MT5 MetaTrader 5

Aleksey Vyazmikin, 2019.02.17 06:56

Ich beschloss, das Experiment noch einmal zu wiederholen, hier ist der Code

      //--- отключим показ ценового графика
      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();
        }

Und hier das Ergebnis

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 Графический объект не найден
Haben Sie eine Idee, was den Fehler verursacht hat?
Mir wurde mitgeteilt, dass der Fehler in der Bibliothek liegt - wird er behoben werden?
 
Aleksey Vyazmikin:
Mir wurde mitgeteilt, dass sich in der Bibliothek ein Fehler eingeschlichen hat - wird dieser korrigiert?

Die Telepathen sind im Urlaub. Und für normale Menschen brauchen wir:

  1. Minimalcode (aus dem alles Unnötige herausgenommen wurde), der das Problem reproduziert.
  2. eine klare Beschreibung des Fehlers (was Sie erhalten möchten, was Sie erhalten und warum Sie glauben, dass es ein Fehler ist)
  3. Spezifikationen des Betriebssystems, Aufbau des Terminals, Name des Handelsservers

 
Aleksey Vyazmikin:
Mir wurde mitgeteilt, dass sich in der Bibliothek ein Fehler eingeschlichen hat - wird dieser korrigiert?

Wo wurde Ihnen gesagt, dass ein Fehler vorliegt? Ich habe es Ihnen gesagt - suchen Sie nach der Stelle in der Bibliothek, an der sie in die Variable _LastError geschrieben werden kann. Es ist nicht unbedingt so, dass der Code mit dem Fehler funktioniert hat. Denn es könnte nach einem Objekt suchen (und wenn es nicht vorhanden ist, wird der Fehlercode in die Variable geschrieben) und es erstellen. Wenn das Objekt jedoch nicht erstellt wird, ist das ein Fehler, aber es wird erstellt und alles wird gut funktionieren. Aber nach der Überprüfung wird der Fehlercode (das Objekt war vor der Erstellung nicht vorhanden) in eine Variable geschrieben, die Sie dann in Ihrem Code lesen können.

 
Vladimir Karputov:

Die Telepathen sind im Urlaub. Und für die einfachen Leute, was gebraucht wird:

  1. Minimalcode (aus dem alles Unnötige herausgenommen wurde), der das Problem reproduziert.
  2. eine klare Beschreibung des Fehlers (was Sie erreichen wollten, was Sie letztendlich erreicht haben und warum Sie es für einen Fehler halten)
  3. Spezifikationen des Betriebssystems, Aufbau des Terminals, Name des Handelsservers

1. Code

//+------------------------------------------------------------------+
//|                                              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. Keine Erwartung von Fehlermeldungen im Protokoll

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 bit, Build 1940, während der Tests nicht mit dem Server verbunden - Broker Discovery.

 
Artyom Trishkin:

Wo wurde Ihnen gesagt, dass ein Fehler vorliegt? Ich habe es Ihnen gesagt - suchen Sie nach einem Fragment in der Bibliothek, wo es in die Variable _LastError geschrieben werden kann. Es ist nicht unbedingt so, dass der Code mit dem Fehler funktioniert hat. Denn es könnte nach einem Objekt suchen (und wenn es nicht vorhanden ist, wird der Fehlercode in die Variable geschrieben) und es erstellen. Wenn das Objekt jedoch nicht erstellt wird, ist das ein Fehler, aber es wird erstellt und alles wird funktionieren. Aber nach der Überprüfung wird der Fehlercode (das Objekt war vor der Erstellung nicht vorhanden) in eine Variable geschrieben, die Sie dann in Ihrem Code lesen können.

Die Bibliothek muss entweder einen Fehler ausgeben, wenn tatsächlich ein Fehler vorliegt, oder die Situation korrekt behandeln und keinen Fehler ausgeben, wenn kein Fehler vorliegt. Wenn meine Verwendung der Bibliothek bei der Fehlerprüfung nicht in der Klasse beschrieben ist, sollten Sie sie angeben. Auf jeden Fall ist es für den Benutzer unzumutbar, die Bibliotheken des Herstellers des Produkts zu bearbeiten.

 
Aleksey Vyazmikin:

Die Bibliothek muss entweder einen Fehler ausgeben, wenn tatsächlich ein Fehler vorliegt, oder die Situation korrekt behandeln und keinen Fehler ausgeben, wenn kein Fehler vorliegt. Wenn meine Verwendung der Bibliothek bei der Fehlerprüfung nicht in der Klasse beschrieben ist, sollten Sie sie angeben. In jedem Fall ist es für den Benutzer unzumutbar, die Bibliotheken des Herstellers des Produkts zu bearbeiten.

Hier liegt kein Fehler vor, lesen Sie es noch einmal:

Wo wurde Ihnen gesagt, dass ein Fehler vorliegt? Ich habe es Ihnen gesagt - suchen Sie nach einem Fragment in der Bibliothek, wo es in die Variable _LastError geschrieben werden kann. Es ist nicht unbedingt so, dass der Code mit dem Fehler funktioniert hat. Denn es könnte nach einem Objekt suchen (und wenn es nicht vorhanden ist, wird der Fehlercode in die Variable geschrieben) und es erstellen. Wenn das Objekt jedoch nicht erstellt wird, ist das ein Fehler, aber es wird erstellt und alles wird gut funktionieren. Aber nach der Überprüfung wird der Fehlercode (das Objekt war vor der Erstellung nicht vorhanden) in eine Variable geschrieben, die Sie dann in Ihrem Code lesen werden.

Es ist also nur in Ihrem Interesse zu wissen, warum Sie den Fehler nach der normalen Ausführung des Codes lesen. Was Sie wahrscheinlich nicht verstehen, ist, dass ein anderer Code als Null in der Variablen _LastError nicht unbedingt bedeutet, dass ein Fehler im Code von CGraphic und nicht nur darin vorliegt. In diesem Fall könnte es sich um ein einfaches Ergebnis der Suche nach der Existenz eines Objekts handeln, das innerhalb der CGraphic in SB ausgeführt wurde. Es gab eine Anfrage für ein Objekt nach Name, das Ergebnis gab -1 zurück und Code 4202 wurde in _LastError geschrieben. Dann wurde das Objekt erstellt, alles funktionierte und wurde an das aufrufende Programm zurückgegeben. Und dort lesen Sie sofort den Fehlercode und erhalten ihn. Aber es gibt keinen Fehler - Sie sehen das Ergebnis der Abfragen innerhalb der SB.

Ich schlage nur einen möglichen Grund für das vor, was Sie berichten.

Wenn Sie also wirklich einen echten Fehler finden und melden wollen, müssen Sie den gesamten CGraphic-Code im Debugger durchgehen und den echten Fehler finden, der zu Logik- und Leistungsfehlern führt, anstatt nur zu behaupten, dass Sie den Fehlercode gelesen haben und er daher definitiv vorhanden ist.

 
Artyom Trishkin:

Hier liegt kein Fehler vor, lesen Sie es noch einmal:

Es ist also nur in Ihrem Interesse zu wissen, warum Sie den Fehler nach der normalen Codeausführung lesen. Sie verstehen wahrscheinlich nicht, dass der Inhalt der Variablen _LastError, der nicht Null ist, nicht unbedingt bedeutet, dass ein Fehler im CGraphic-Code vorliegt, und nicht nur in diesem. In diesem Fall könnte es sich um ein einfaches Ergebnis der Suche nach der Existenz eines Objekts handeln, das innerhalb der CGraphic in SB ausgeführt wurde. Es gab eine Anfrage für ein Objekt nach Name, das Ergebnis gab -1 zurück und Code 4202 wurde in _LastError geschrieben. Dann wurde das Objekt erstellt, alles funktionierte und wurde an das aufrufende Programm zurückgegeben. Und dort lesen Sie sofort den Fehlercode und erhalten ihn. Aber es gibt überhaupt keinen Fehler - Sie sehen das Ergebnis der Abfragen innerhalb der SB.

Ich schlage nur einen möglichen Grund für das vor, was Sie berichten.

Wenn Sie also wirklich den wirklichen Fehler finden und melden wollen, dann müssen Sie den gesamten CGraphic-Code im Debugger durchgehen und den wirklichen Fehler finden, der die Logik und die Operation zum Scheitern bringt, anstatt einfach zu behaupten, dass Sie den Fehlercode gelesen haben und er daher definitiv vorhanden ist.

Sie selbst sagten in Ihrer logischen Argumentation, dass es einen Fehler im Code geben könnte, und er drückt sich darin aus, dass der Fehler nicht zurückgesetzt wird. der aufgrund des Fehlens eines Objekts empfangen wurde, bevor es erstellt wurde.

Nein, ich habe nicht die Kompetenz, in einem komplexen Code nach einem Fehler zu suchen und dann die Antwort zu bekommen, dass das so beabsichtigt war.

Können Sie mir bitte sagen, ob diese Meldung ein Benutzerfehler ist oder nicht?

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

Der Code, der darauf hinweist, lautetD.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:

Sie selbst haben in Ihrer logischen Argumentation angedeutet, dass ein Fehler im Code vorliegen könnte, der dadurch zum Ausdruck kommt, dass der Fehler nicht zurückgesetzt wird. der aufgrund des Fehlens des Objekts vor seiner Erstellung empfangen wurde.

Nein, ich habe nicht die Kompetenz, in einem komplexen Code nach einem Fehler zu suchen und dann die Antwort zu bekommen, dass das so beabsichtigt war.

Können Sie mir bitte sagen, ob diese Meldung ein Benutzerfehler ist oder nicht?

Er verweist auf diesen Code -D.PointsFill(false);

Ich verstehe die Bedeutung dieses Satzes überhaupt nicht.

Es scheint mir, dass ich Ihnen bereits alles ausführlich beschrieben habe.

Ich weiß es nicht. Nicht viele Informationen.

 
Artyom Trishkin:

Ich verstehe den Sinn dieses Satzes überhaupt nicht.

Ich habe den Eindruck, dass ich Ihnen bereits alles ausführlich erklärt habe.

Ich weiß es nicht. Nicht viele Informationen.

Sie verstehen nicht, dass, wenn Ihr Code so aufgebaut ist, dass er auf einen Fehler reagiert (wir erstellen ein Objekt im Falle eines Fehlers), es logisch ist, nach der Behebung des Fehlers(Erstellen eines Objekts) diesen Fehler zurückzusetzen, was Ihrer logischen Argumentation zufolge in der Bibliothek nicht geschieht.

Auch hier habe ich keine Informationen, wie ich auf diesen Fehler reagieren soll...

 
Aleksey Vyazmikin:

Sie verstehen nicht, dass, wenn der Code auf Fehlerreaktion aufgebaut ist (im Falle eines Fehlers wird ein Objekt erstellt), es logisch ist, nach der Fehlerkorrektur(Objekterstellung) diesen Fehler zurückzusetzen, was nach Ihrer logischen Argumentation in der Bibliothek nicht geschieht.

Hier habe ich keine Informationen, wie ich auf diesen Fehler reagieren kann...

Sie müssen sich darüber im Klaren sein, dass nicht der Code in _LastError, der ungleich Null ist, einen Fehler darstellt, sondern das von der Funktion zurückgegebene Ergebnis, das die fehlerhafte Ausführung dieser Funktion anzeigt. Und _LastError enthält Code, der genau auf den Fehler verweist, der die Funktion versehentlich ausführt. Es ist also zweifelhaft, dass Sie die Beschreibung des in der Dienstvariablen gespeicherten Fehlercodes verwenden können, anstatt direkt den Rückgabecode der Funktion zu verwenden. Wenn die Funktion -1 oder false oder 0 zurückgegeben hat (für jede Funktion ist ihr Fehlercode in der Hilfe beschrieben), dann sollte nur die Analyse des von der Funktion zurückgegebenen Ergebnisses von Ihnen behandelt werden, nicht der Code in _LastError, der nicht den Fehler angibt, sondern dazu dient, die Ursache für die Rückgabe eines von der Funktion zurückgegebenen Ergebnisses anzugeben.

Die Objektsuchfunktion gibt einen Wert kleiner als Null zurück, wenn ein Objekt mit dem angegebenen Namen nicht existiert. Handelt es sich um einen Fehler? Nein. Dies ist eine Standardantwort der Funktion, auf deren Grundlage Sie eine Entscheidung über die Erstellung eines Objekts mit dem angegebenen Namen treffen. Der in _LastError enthaltene Code besagt ausdrücklich, dass "ein Objekt mit dem angeforderten Namen nicht existiert" - Sie können es erstellen.

Nun, ich bin es leid, es Ihnen zu erklären. Wer es will, wird es verstehen.