Fehler, Irrtümer, Fragen - Seite 1733

 
Комбинатор:

Referenz für Arrays ist eine Krücke in der MQL-Sprache, nicht eine Referenz.

Und wenn [] ein Typmodifikator wie * ist, sollte es eine eigene const! haben und nicht eine Referenz.

Ich kann nur etwas in MQL schreiben.
 
A100:
Der Fehler ist berechtigt - diese Bezeichner sind in der Hilfe als ReadOnly aufgeführt (nicht mit ChartSetInteger kombiniert)https://www.mql5.com/ru/docs/constants/chartconstants/enum_chart_property
Ich habe es bereits herausgefunden, aber trotzdem danke :)
 
coderex:
Würde es helfen?

Lesen Sie ihn sehr sorgfältig. C++ ist viel schwieriger zu verstehen als MQL. Ich kann dem Artikel nicht viel abgewinnen. Und ich habe überhaupt nicht verstanden, was das mit dem zu tun hat, was hier diskutiert wird.

Ich fand die Funktion jedoch gut,

perfectforwarding

Bevor wir beschreiben, worum es sich dabei handelt, wollen wir auf die vorherige Norm zurückkommen und das bestehende Problem beschreiben. Angenommen, wir haben eine Schablonenfunktion foo, die einen Parameter annimmt und ihn an die Funktion bar(T& something) übergibt:

template <typename T>
void foo(T& Object)
{
    bar(Object);
}

Es ist also alles in Ordnung. Was aber, wenn wir z.B. die Zahl 100 als Argument an eine Funktion übergeben wollen?

Keine Sorge, wir werden es so schreiben:

template <typename T>
void foo(const T& Object)
{
    bar(Object);//Ooops
}

Aber in diesem Fall wird es einen Kompilierungsfehler geben, weil bar eine nicht konstante Referenz nimmt. Wir müssen also 2 Funktionen bereitstellen - eine konstante und eine nicht-konstante. Und nun stellen wir uns vor, dass es nicht nur einen Parameter gibt, sondern 2, 3 oder 5. Es stellt sich heraus, dass diese Aufgabe sehr schwierig zu implementieren ist, da wir (2^n - 1) überladene Funktionen haben, wobei n die Anzahl der Funktionsargumente ist. Wenn Sie der Meinung sind, dass eine solche Anzahl von Parametern schlechter Stil ist und niemand auf diese Weise schreibt, dann schauen Sie sich std::bind, std::make_shared usw. an.


Nun wollen wir sehen, welche Lösung uns die neue Norm bietet:

template <typename T>
void foo(T&& Object)
{
    bar(std::forward<T>(Object));
}

Mit dem obigen Code ist das Problem der Parameterübergabe vollständig gelöst, was als perfekte Übergabe bezeichnet wird, da der Argumenttyp zwischen Aufrufen der externen Funktion foo und der internen Funktion bar erhalten bleibt. Es besteht keine Notwendigkeit mehr, eine Reihe von Funktionen zu überladen - Entwickler von generischem Code können zufrieden sein.


Diese Lösung ist möglich, denn wenn der Template-Parameter T& ist, speichert sich der übergebene Typ selbst, und std::forward wird benötigt, weil jeder benannte Typ innerhalb der Funktion foo zu einem lvalue wird und wir den ursprünglichen Typ benötigen - dafür ist std::forward da - es speichert den ursprünglichen Typ und entfernt den Namen des Arguments (was zu T&& führt), wodurch es später an die exakte bar-Funktion übergeben werden kann.

"(2^n - 1) überladene Funktionen, wobei n die Anzahl der Funktionsargumente ist" - Ich habe solche Unannehmlichkeiten in MQL erlebt.
 
2016.10.15 09:48:01.820 MQL5    wrong type, loading of Test9 failed
Was ist das?
 
1455 - Debugging auf historischen Daten (CTRL+F5) funktioniert nicht. Das Testerfenster erscheint, die Visualisierung startet nicht.
 
fxsaber:
1455 - Debugging auf historischen Daten (CTRL+F5) funktioniert nicht. Das Testerfenster erscheint, die Visualisierung startet nicht.
Das stimmt nicht. Außerdem gibt es keine technischen Details oder Beschreibungen Ihrer Aktionen. Dies ist ein spezieller Bereich, in dem Sie zusätzliche Informationen vorbereiten und bereitstellen müssen, bevor Sie über einen angeblich gefundenen Fehler schreiben.
 
fxsaber:

Lesen Sie ihn sehr sorgfältig. C++ ist viel schwieriger zu verstehen als MQL. Ich kann dem Artikel nicht viel abgewinnen. Und ich verstehe überhaupt nicht, was das mit dem zu tun hat, was hier diskutiert wird.

Ich fand diese Funktion jedoch gut,

Ich bin auf "(2^n - 1) überladene Funktionen, wobei n die Anzahl der Funktionsargumente ist" gestoßen - das ist eine Unannehmlichkeit in MQL.

Es geht darum, rvalue / lvalue / prvalue / xvalue / gvalue zu verstehen, d.h. das, worüber Sie im Grunde mehrere Seiten lang gesprochen haben :) Wie ich sehe, folgte MQ den C++-Standards und übernahm die ihrer Meinung nach wertvollsten Dinge von dort, ohne nur bei rvalue / lvalue stehen zu bleiben.

Ich bin mir dieser Konzepte selbst noch nicht ganz bewusst, obwohl ich sie logisch verstehe :)

Übrigens arbeitet der Speichermanager in MT5 unverständlich, wenn das Programm den Speicher voll ausnutzt. Ich habe es nicht an kleinen Größen gemessen.

Ich besitze zum Beispiel 4 Gigabyte RAM, 2 Kerne, MT5 v1455 x64 auf einer virtuellen Maschine.

Ich lade den Speicher mit Objekten und im Task-Manager sehe ich, dass 1,5 Gbyte Speicher pro Terminal und 1,5 Gbyte pro virtuellem Speicher verwendet werden.MQL_MEMORY_USED zeigt 400 MB nutzbaren Speicher an. Vor dem Start waren es etwa 140 MB für das Terminal und 150 MB für die virtuelle App.

Mir ist auch aufgefallen, dass der Speichermanager, sobald der Speicherverbrauch 400 MB übersteigt, den Speicher nicht vollständig freigibt, obwohl die Objekte tatsächlich gelöscht werden. Und das Verhalten des Debuggers ist unvorhersehbar - ich komme zum Löschen von Objekten, warte auf deren vollständige Entfernung und stoppe danach das Debugging (mit der STOP-Taste im Debugger), es stoppt, der MT5-Manager hat dem System keinen Speicher zugewiesen, d.h. es sind noch 1,5 Gb für das Terminal und 1,5 Gb für den virtuellen Speicher vorhanden. МТ5 selbst hat den Debugging-Prozess noch nicht abgeschlossen, obwohl ME anzeigt, dass das Debugging abgeschlossen ist. Wenn der Objektspeicher weniger als 400 MB beträgt, ist alles in Ordnung, außer dass der Speicher freigegeben wird.

Der Speicher wird erst freigegeben, nachdem die Terminalaufgabe aus der Liste der laufenden Aufgaben entfernt wurde.

 
Karputov Vladimir:
Das ist nicht der Fall. Außerdem gibt es keine technischen Details oder Beschreibungen Ihrer Aktionen. Dies ist ein spezieller Bereich, in dem Sie zusätzliche Informationen vorbereiten und bereitstellen müssen, bevor Sie über einen angeblich gefundenen Fehler schreiben.

Die Service-Desk-Entwickler haben sich meine Konfiguration bereits mehrfach gemerkt.

Ich nehme einen beliebigen Standard-Expert Advisor und drücke im MetaEditor die Tastenkombination STRG+F5. Das Hauptfenster des Strategietesters wird mit den im MetaEditor festgelegten Einstellungen geöffnet. Aber die Visualisierung startet nicht.

Das Protokoll

2016.10.15 10:06:09     Tester  Leverage 1:100 set error
 
fxsaber:
Die Service-Desk-Entwickler haben sich bereits mehrmals an meine Konfiguration erinnert.

Sie haben nicht einmal begriffen, wovon ich spreche.

Was haben Sie getan, bevor Sie mit der Fehlersuche in der Geschichte begonnen haben? Haben Sie MetaEditor konfiguriert (Registerkarte "Tools" - "Einstellungen" - "Debugging")? Zeigen Sie einen Screenshot von MetaEditora (Registerkarte "Tools" - "Einstellungen" - "Debugging"), was steht im Tester auf der Registerkarte "Log"? Was wird im Viewer auf der Registerkarte "Log" geschrieben?

 
fxsaber:

Die Service-Desk-Entwickler haben sich meine Konfiguration bereits mehrfach gemerkt.

Ich nehme einen beliebigen Standard-Expert Advisor und drücke im MetaEditor die Tastenkombination STRG+F5. Das Hauptfenster des Strategietesters wird mit den im MetaEditor festgelegten Einstellungen geöffnet. Die Visualisierung startet nicht.

Die MACD-Probe wird normal gestartet. Vielleicht ist etwas mit den Einstellungen nicht in Ordnung?