Array-Referenzen

 

Motiv:

Der Punkt ist, dass man in Truthähnen häufig Zugriff auf Zeitreihen benötigt, die an OnCalculate übergeben werden.

Die Verschachtelung dieser Funktionen kann recht umfangreich sein, und wir müssen dieses Array von OnCalculate als Parameter durch die gesamte Aufrufkette ziehen.

Während in einem bedeutenden Teil der Kette diese Anordnung in der Hölle nicht benötigt wird.

Was wir wollen:

Eine Art von Array-Referenz, etwa so:

class TimeReference
{
//
   datetime Time[];
};

TimeReference TimeRef;

datetime F()
{
   return TimeRef.Time[0];
}

int OnCalculate(const int bars,
                const int counted,
                const datetime& time[],
                const double& open[],
                const double& high[],
                const double& low[],
                const double& close[],
                const long& tick_volume[],
                const long& volume[],
                const int& sprd[])
{
   TimeRef.Assign(time);
   F();
}

ABER. Obligatorische Bedingung - es sollte kein Array-Kopieren stattfinden.

Auf den ersten Blick mag dies unrealistisch erscheinen. Aber ich vermute, dass es machbar ist.

Was meinen Sie, meine Herren?

 

MQL verweist nicht explizit auf den Speicher.

Aber Sie können es mit memcpy erhalten. es gibt zurück, was Sie brauchen.

Dann können Sie diesen Wert an eine beliebige Stelle ziehen und memcpy auf die gleiche Weise verwenden.

Lesen Sie meinen Artikel über DLLs

 
sergeev:
Wie bringe ich diesen Zeiger wieder an?
 
Das gleiche memcpy, an das der Zeiger übergeben wird.
 
sergeev:
mit memcpy. dorthin wird der Zeiger übergeben.

Nein, sie können den Zeiger nehmen, aber nicht den Zettel.

___________

Okay, es ist also wahrscheinlich unmöglich, es richtig zu machen.

 
TheXpert:
Nein, sie können den Zeiger mitnehmen, aber nicht ausrutschen.

und schlüpfen Sie hinein, getestet.

 
sergeev:

und schlüpfen Sie hinein, getestet.

Nennen Sie mir ein Beispiel.
 
TheXpert:
Zeigen Sie mir ein Beispiel.

Das steht doch in dem Artikel, oder?

Wenn ich versuche, den Code einzufügen, friert der Server ein.

 
sergeev:

Das steht doch in dem Artikel, oder?

Das steht nicht in dem Artikel. Es wird lediglich Speicher von einem Array in ein vorbereiteteres Array kopiert.
 
https://www.mql5.com/ru/articles/364#3

erstes Beispiel

int Source wird übergeben - im Wesentlichen eine Speicheradresse

und in das Array char Dest[10] kopiert

Избавляемся от балласта самодельных DLL
Избавляемся от балласта самодельных DLL
  • 2012.01.31
  • o_O
  • www.mql5.com
Если MQL5-программисту недостаточно функционала языка, он вынужден обращаться к дополнительным инструментам. Для этого приходится использовать другой язык программирования и создавать промежуточную DLL. В MQL5 имеется механизм представления разных типов данных с помощью структур и передачи их в API, но к сожалению, MQL5 не отвечает нам на вопрос о том, как вытянуть данные из принятого указателя. В данной статье мы поставим точку в этом вопросе и покажем простые механизмы обмена сложными типами данных и работе с ними.
 

haben Sie es richtig? sind Sie überladen memcpy für alle Typen jetzt?

Vergessen Sie nur nicht, dass die Adressgröße für 64 Bit lang ist.

--------------

Vorschlag Nummer eins: Glauben Sie, wir sollten die Entwickler bitten, eine native Funktion wie long ArrayGetAddress( object array) zu erstellen?

Wenn sie es nicht tun wollen, Vorschlag zwei: Wir sollten #ifdef vorantreiben. Renat hat versprochen, es zu implementieren.

Grund der Beschwerde: