Fehler, Irrtümer, Fragen - Seite 2297

 
Nikolai Semko:

Danke, aber ich habe dort keine Antworten auf meine Fragen gefunden.
Ich verstehe nicht, warum der Destruktor nicht aufgerufen wird, wennA *a= new A;

https://www.mql5.com/ru/docs/basis/variables/object_live

Alle durch den Ausdruck pointer_object=newClass_nameerzeugten Objekte müssen anschließend durch den Operator delete(pointer_object) zerstört werden. Wenn diese Variable aus irgendeinem Grund nichtdurch den Löschoperator zerstört wurde, erscheint die entsprechende Meldung im Journal "Experten". Es ist möglich, mehrere Variablen zu deklarieren und sie alle demselben Objektzeiger zuzuweisen.

Документация по MQL5: Основы языка / Переменные / Создание и уничтожение объектов
Документация по MQL5: Основы языка / Переменные / Создание и уничтожение объектов
  • www.mql5.com
После загрузки на исполнение mql5-программы каждой переменной выделяется память в соответствие с типом переменной. Переменные делятся на два типа по уровню доступа - глобальные переменные и локальные переменные, и по классам памяти: входные параметры mql5-программы, статические и автоматические. Каждая переменная при необходимости...
 

Ich bitte MQL, die Funktion OnTimer() zu prüfen.

Aus irgendeinem Grund funktioniert es nicht in Strategie-Tester für MT4 (keine Fehler, nur nichts innerhalb dieser Funktion ausgeführt wird), während es online ist OK.

Für MT5 funktioniert die Funktion sowohl im Tester als auch online.

Ich danke Ihnen!

 
Viel Zeit wird auf Incorrect-Init verwendet
Core 1  pass 114 tested with error "incorrect input parameters" in 0:00:00.218

In OnInit werden nur zwei Zahlen verglichen, und ein fehlerhafter Durchlauf benötigt mehr Zeit als ein vollständiger Durchlauf! Wie kommt das?


Lassen wir diesen Expert Advisor mit voller Optimierung laufen

input int Range = 0; // задать Оптимизацию 1 .. 10000

int OnInit() { return(INIT_PARAMETERS_INCORRECT); }


Wir erhalten das Ergebnis der Arbeit von 8 Agenten

Tester  optimization finished, total passes 10000
Statistics      optimization done in 2 minutes 24 seconds


Hier ist unser Expert Advisor jetzt

input int Range = 0; // задать Оптимизацию 1 .. 10000

void OnInit() {}
Tester  optimization finished, total passes 10000
Statistics      optimization done in 0 minutes 31 seconds


Endlich, wie dieser hier

input int Range = 0; // задать Оптимизацию 1 .. 10000

void OnInit() { ExpertRemove(); }
Tester  optimization finished, total passes 10000
Statistics      optimization done in 2 minutes 19 seconds


Zwei Ausgänge

  1. Incorrect-Init und ExpertRemove sind in Bezug auf die Geschwindigkeit gleich.
  2. Ein Leerlauf ist ~5 mal schneller als ein Ausstieg aus OnInit.


Was den zweiten Punkt betrifft, so liegt eindeutig ein Fehler vor. Es ist zeitlich günstiger, einen Leerlauf durchzuführen, als aus OnInit herauszuspringen. Bitte korrigieren Sie dies, da sonst die Vorteile von Incorrect-Init und ExpertRemove fast vollständig verloren gehen.

 

Die Registerkarte "Favoriten" mit EAs/Indikatoren/Skripten und Konten wird erst nach dem Verlassen des Terminals gespeichert. Aus diesem Grund wird diese Registerkarte bei einem abnormalen Ausgang (Stromausfall) zurückgesetzt. Ist es möglich, sie zu speichern, wenn sie geändert wird?

Manchmal ist man sich darüber im Klaren, dass es sehr praktisch wäre, wenn Ordner zu den Favoriten hinzugefügt werden könnten.

 
A100:
Dann versuchen Sie es so:

Ergebnis:

1:ZEIGER_AUTOMATISCH
1:ZEIGER_DYNAMISCH
2:ZEIGER_DYNAMISCH
2:ZEIGER_AUTOMATISCH

Ich danke Ihnen! Das ist eine gute Lösung.

Aber es ist wahrscheinlich besser, wenn der Compiler nicht flucht:

class B  { public:
                     B(void *b) {d=b;}
                    ~B() { delete d; }
   void             *d; };

Ist das ein Fehler oder was?
Wenn Sie eine Instanz einer Klasse mit new erstellen, wird der Destruktor nicht aufgerufen.

Ist es die einzige Lösung, eine spezielle Klasse für den Aufruf des Destruktors zu erstellen? Oder können wir auf sie verzichten?

 
Andrey Barinov:

Anlegen mit Neu und Löschen mit Löschen

Die Frage ist, delete in einen Destruktor zu packen, aber wenn man eine Instanz einer Klasse über new (A *a=newA ;) erzeugt, wird der Destruktor nicht aufgerufen.

 
aleger:

Ist es möglich, und wenn ja, wie, in jedem ZigZag-Indikator die entsprechenden Werte der Preisextreme High und Low abzuleiten,

ihre stabile Bindung und ihre Nähe zu den geformten Ober- und Unterteilen gewährleisten?

Siehe Beispiel ausOBJ_TEXT

 

Ich danke Ihnen.
Das ist genau das, was hier steht.

Все объекты, созданные выражением указатель_объекта=new Имя_Класса, обязательно должны быть впоследствии уничтожены оператором delete(указатель_объекта). 
Если по каким то причинам такая переменная по окончании работы программы не была уничтожена оператором delete, то об этом будет выведено сообщение в журнал "Эксперты". 
Можно объявить несколько переменных и всем им присвоить указатель одного объекта.
Если динамически создаваемый объект имеет конструктор, то этот конструктор будет вызван в момент выполнения оператора new. Если объект имеет деструктор, 
то деструктор будет вызван в момент выполнения оператора delete.

Es handelt sich also nicht um einen Fehler, sondern um eine Funktion, die zu einem Teufelskreis führt.
Wenn ich den Prozess des Löschens eines dynamischen Objekts automatisieren möchte, wird der Destruktor nur bei delete aufgerufen, so dass es sinnlos ist, delete in den Destruktor selbst aufzunehmen.
Aber die Automatisierung kann durch eine weitere Instanz einer anderen Klasse implementiert werden, wie @A100hier vorgeschlagen hat.

 
aleger:

Danke für den Hinweis. Ich bin schon ganz erschöpft vom Lesen und Probieren und Probieren und Lesen. Ich würde gerne ein funktionierendes Beispiel für den ZigZag sehen...

Wie auf meinem Avatar mit Zickzack, aber mit einer RECHTEN Bindung der oberen Extrema, denn die Bindung der unteren Extrema ist OK!

Der Weg der Bindung über k=(WindowPriceMax()-WindowPriceMin())/30 bei großen Fenstergrößenänderungen bringt nichts, ich wünsche mir etwas anderes...


ImOBJ_TEXT-Beispiel sind sowohl der obere als auch der untere Teil gebunden. Folgen Sie dem Link, führen Sie das Beispiel aus ...

 
Nikolai Semko:

Es handelt sich also nicht um einen Fehler, sondern um eine Funktion, die zu einem Teufelskreis führt.

Es wurde Ihnen bereits gesagt, dass die Verwendung von intelligenten Zeigern die Lösung für die Kontrolle von zugewiesenen, nicht verwaltbaren Ressourcen darstellt. Die vollständige Analogie zu C++.
Vielleicht liegt das Problem darin, dass die Lösung nicht auf dem Silbertablett serviert wurde, sorry.


Jeder kann "shared_ptr" in die Site-Suche eingeben und dem ersten Ergebnis folgen, es ist nicht schwer, ich empfehle dringend, es zu versuchen.

Grund der Beschwerde: