Array-Referenzen - Seite 6

 

Für Informationen:

  1. Alle Arrays in MQL5 werden nur per Referenz übergeben (4 oder 8 Bytes im Stack), also haben Sie keine Angst, Arrays innerhalb von Funktionen zu übergeben - keine besonderen Kosten.
  2. Es ist sehr gefährlich, echte Speicherreferenzen zu speichern, insbesondere Referenzen auf Arrays, die vom Terminal selbst gesteuert werden(Indikatorpuffer, OHLC-Puffer), da sie tatsächlich geändert/neu zugewiesen werden. Außerdem ist es unmöglich, undokumentierte Verweise zwischen Aufrufen (Ausgabe und Eingabe in den Skriptcode) an den EA zu speichern.
  3. Bei der Übergabe eines Arrays an eine DLL wird die Startadresse des Datenblocks angegeben, und die Dimensionen müssen separat angegeben werden.
 
mql5:

Das erste, was man verstehen muss, ist WARUM? Und was nützt das?

Wenn Sie keine Links herstellen wollen, tun wir es selbst.

Und dank der Teilnehmer, dank der Beiträge in diesem Thread habe ich herausgefunden, dass die Beschreibung in der Hilfe veraltet ist...

Ja, das ist urkomisch) . Aber eigentlich dachte ich nicht einmal, dass es in der Hilfe veröffentlicht werden könnte.

Können Sie mir schon etwas über die Flaggen erzählen?

Renat:

Für Informationen:

  1. Alle Arrays in MQL5 werden nur per Referenz übergeben (4 oder 8 Bytes im Stack), also haben Sie keine Angst, Arrays innerhalb von Funktionen zu übergeben - keine besonderen Kosten.

Ich habe keine Angst, ich bin mir bewusst, dass es billig ist. Es ist einfach unpraktisch.

  1. Es ist sehr gefährlich, echte Speicherreferenzen zu speichern, insbesondere Referenzen auf Arrays, die vom Terminal selbst verwaltet werden(Indikatorpuffer, OHLC-Puffer), da diese tatsächlich geändert/neu zugewiesen werden. Darüber hinaus dürfen undokumentierte Verweise zwischen Aufrufen (Ausstieg und Einstieg in den Skriptcode) von EA nicht gespeichert werden.

Bitte erläutern Sie diesen Punkt - kann während OnCalculate eine Neuzuweisung von Speicher erfolgen? Das ist Blödsinn.

Über zwischen den Anrufen, natürlich, ist es klar.

Ich möchte keine Funktion haben, die einen Indikator oder ein Terminal im Allgemeinen bindet, also werde ich die sicherste verfügbare Variante verwenden.

 
TheXpert:

Mehr zu diesem Punkt bitte - kann es Speicher Neuzuweisung während OnCalculate sein? Das ist einfach verrückt.


Nicht "während" - sondern zwischen.
 
TheXpert:

Mehr zu diesem Punkt bitte - kann es Speicher Neuzuweisung während OnCalculate sein? Das ist schade.

Das mit den Zwischenrufen ist natürlich verständlich.

Natürlich geht es um eine mögliche Umverteilung zwischen den einzelnen Anrufen.

Das Problem ist, dass jemand aus Versehen oder explizit eine Referenz zwischen den Aufrufen speichert, in 99% der Fälle funktioniert alles bis zum Absturz. Danach wird es erwartungsgemäß heißen: "Das ist die Schuld von Metakvote".

Wir haben zum Beispiel solche Gedanken von einem Genossen verbreiten lassen, und das schon seit mehreren Jahren, weil er nicht akzeptieren konnte, dass die Geschichte zwischen den Anrufen vertauscht/verändert werden kann.

 
Renat:

Natürlich geht es um eine mögliche Umverteilung zwischen den Anrufen.

Das Problem ist, dass jemand die Verknüpfung zwischen den Aufrufen versehentlich oder explizit speichert. In 99 % der Fälle wird alles bis zum Absturz funktionieren. Danach wird es die erwarteten "Es ist Metakwots Schuld"-Gedanken geben.

"Schuld zu fürchten, heißt nicht, vorwärts zu gehen" (c).

Und noch etwas: Es ist besser, das Getane zu bedauern als das Nichtgetane.

Renat, ich stimme zu, dass Referenzvariablen eine potenzielle Problemquelle sind, aber das kann man über fast jedes Tool sagen. Manchmal stoßen Menschen andere Menschen mit Schraubenziehern an. Es hat keinen Sinn, Schraubendreher jetzt zu verbieten, und es ist noch unsinniger, sie einfach aus der Produktion zu nehmen, denn sie können ohne allzu große Probleme zu Hause hergestellt werden.

"Referenzen" als mql-Entität ist höchst wünschenswert, nicht einmal in Form von Variablen, sondern als Möglichkeit, eine Referenz ( lvalue ) von einer Funktion zurückzugeben. Dies wird es ermöglichen, zumindest wirklich schnelle linke Indexer für Container zu machen und viele andere zusätzliche Funktionen zu geben, wie:

MyTree.Search(Key).GetElement() = NewVal;

Und ich verstehe, dass die Leute eine Referenz auf eine lokale Variable aus einer Funktion zurückgeben wollen!

Also, was? Vergessen Sie die Referenzen, weil sie das Leben für Dummköpfe schwieriger machen können?)

--

Solche Einschränkungen von mql5 (wie das Fehlen von Links) motivieren manchmal stark zur "Flucht in die DLL", wodurch MT5 nur zu einem "Markttreiber" wird, der die Verbindung mit dem Broker herstellt. Aber die ursprüngliche Idee war genau das Gegenteil - die Notwendigkeit, externe Programmiertools zu verwenden, zu eliminieren, weil"alles hier ist".

 

Es gibt kein Zurück mehr, denn wir streben nach maximaler Sprachsicherheit.

Die Arbeit mit rohen Links ist ein solider und sicherer Schritt in Richtung Absturz. Und das Abstürzen von Programmen, bei denen das gesamte Virtualisierungssystem ausgeschaltet ist, ist nicht erlaubt.

Unsere Entscheidung ist umfassend informiert. MQL5 wird verwendet, um Programme zu schreiben, die auf einer großen Anzahl von Computern und ohne menschliches Zutun laufen.

 

Wie auch immer, ich hoffe, das Prinzip ist für jeden klar, der es braucht. Ich werde sie vorerst für mich behalten. Aber sie wird es sein, und sie wird offen sein.

Ich brauche wohl nicht zu erklären, dass Verweise auf Grundtypen wie int viel einfacher und ohne größere Probleme zu erstellen sind.

Das einzige Problem, das zu Komplexität und Implementierungsproblemen führt, ist der Umfang der zugrunde liegenden Variablen. Es gibt wirklich eine breite Palette von Möglichkeiten.

________

Nun, und zur Motivation ist es erwähnenswert, dass Links eine ganze Reihe von zusätzlichen Möglichkeiten eröffnen, wie zum Beispiel Wrapper.

 
lwertige Verbindungen sind geplant...
 
mql5:
lwertige Verbindungen sind geplant...
Mann, das hättest du mir gleich sagen sollen), dann hätte ich mich nicht gewehrt. Aber das ist großartig.
 

Ich grüße alle.


Ich frage mich, ob sich in acht Jahren etwas geändert hat?

Oder ist es immer noch möglich, eine Array-Adresse von OnCalculate() nur mit msvcrt.dll und memcpy-Funktion zu erhalten?

Oder "schleppt" jeder immer noch Referenzen auf Arrays durch die gesamte Klassenstruktur (oder organisiert seine eigenen Arrays und kopiert jedes Mal den Inhalt)?

Grund der Beschwerde: