Mein Ansatz. Der Kern ist der Motor. - Seite 99

 
Реter Konow:
Kurz gesagt, jedes Mal, wenn Sie einen Benutzerparameterwert ändern, sollte dieser Wert in einen variablen Wert aus der Union umgewandelt und sofort in einem gemeinsamen Byte-Array gespeichert werden, das Sie dann in uint umwandeln und in die Ressource schreiben können.

Sie müssen einen Benutzerparameter innerhalb der Vereinigungsstruktur haben. Wenn Sie den Parameter ändern, ändert sich die Struktur mit einer gleichzeitigen Änderung des int-Arrays

union c
{
  uint i[2];
  long width;
}cc;
 
cс.width = 200;

i[2] ist eine Benutzerressource, die von einem anderen Programm gelesen wird.

Mit einer Zeile cc.width = 200 ändern Sie:

  1. Der Parameter, der für die Breite verantwortlich ist,
  2. Die Struktur, die diesen Parameter enthält,
  3. Das Array der Ressource, die von dem anderen Programm gelesen wird.

Und hier gibt es keine Konvertierung und kein Kopieren, sondern nur ein Mapping.
 
Vasiliy Sokolov:


Ich kann die Wrapper-Funktionen in der Datei mit den Verbindungseigenschaften ändern und jeden verwendbaren Wert in die entsprechende Variable aus der Union umwandeln und ein Byte-Array im laufenden Betrieb erstellen. Textwerte, die ebenfalls übergeben werden müssen, müssen jedoch mitStringToChar() in ein Byte-Array umgewandelt werden.

Damit entfällt jedoch der Sinn der Verwendung einer Gewerkschaft. Wenn ich ohnehinStringToChar() verwenden muss, warum nicht alles zu einem String zusammenfügen und dann den gesamten String mitStringToChar()in Bytes übersetzen?

 
Vasiliy Sokolov:

Sie müssen einen Benutzerparameter innerhalb der Vereinigungsstruktur haben. Wenn Sie den Parameter ändern, ändert sich die Struktur mit einer gleichzeitigen Änderung des int-Arrays

i[2] ist eine Benutzerressource, die von einem anderen Programm gelesen wird.

Mit einer Zeile cc.width = 200 ändern Sie:

  1. Der Parameter, der für die Breite verantwortlich ist,
  2. Die Struktur, die diesen Parameter enthält,
  3. Das Array der Ressource, die von einem Drittanbieterprogramm gelesen wird.

Und hier wird nicht konvertiert oder kopiert, sondern nur zugewiesen.

Vasily, du vergisst, dass es sich um eine zweiseitige Kommunikation handelt. In meiner Engine kann ich alles mit Unions verknüpfen, aber ich kann nicht für den Anwendercode verantwortlich sein. Ich kann mir nur Wrapper ausdenken und sie in die Plugins einbauen.

Wo ist die Garantie, dass der Nutzer die Gewerkschaften auch nutzen wird? Wenn er also meine Wrapper-Funktionen aufruft, muss ich seinen Wert selbst übernehmen und auf eine meiner Variablen aus meinen Unions in seiner Plugin-Datei übertragen.

 
Реter Konow:

Ich kann die Wrapper-Funktionen in der Datei mit den Verbindungseigenschaften ändern und jeden verwendbaren Wert in die entsprechende Variable aus der Union umwandeln und ein Byte-Array im laufenden Betrieb erstellen. Textwerte, die ebenfalls übergeben werden müssen, müssen jedoch mitStringToChar() in ein Byte-Array umgewandelt werden.

Damit entfällt jedoch der Sinn der Verwendung einer Gewerkschaft. Wenn ich ohnehinStringToChar() verwenden muss, warum nicht alles zu einem String zusammenfügen und dann den gesamten String mitStringToChar()in Bytes übersetzen?

Denn dann haben Sie ein doppeltes Parsing. Sie werden alles in eine Zeichenkette umwandeln, das ist sehr langsam. Dann parsen Sie die Zeichenkette in ein Array, was sehr schnell geht. Dann setzt man sie wieder zu einem String zusammen - das geht sehr schnell. Dann muss man die Zeichenkette in die richtigen Typen zerlegen - das ist sehr langsam.

 
Реter Konow:

OK, aber was ist mit Texten?

Sie müssen mitStringToChar() in Bytes umgewandelt werden. Sie können keine Gewerkschaft verwenden, richtig?

Ja, man muss sie übersetzen, aber im Gegensatz zum Parsing geht das schnell.

 

Zum Beispiel:

Hier ist die Wrapper-Funktion in der Plug-in-Datei für dieVerbindungseigenschaften:

string E_Last_10_bars_2_Close_price(string n = rare_value,  int Property = -1){return(GET_N_SET(11,n,Property));}

Diese Funktion wird wie folgt aufgerufen:

E_Last_10_bars_2_Close_price(Close[2]);

Das heißt, der Benutzer setzt den Wert vonClose[2] in einer Tabellenzelle.

Close[2] - это значение дабл.

Daher kann ich innerhalb seiner Wrapper-Funktion in seinem Programm den Wert(Close[2]) als ein Char-Array darstellen.

Aber in derselben Zelle kann der Benutzer den Wert "Hallo! :)" senden, und was ist dann zu tun?

E_Last_10_bars_2_Close_price("Привет! :)");
 
 

Oh, Peter, du hast mit der falschen Programmiersprache angefangen. Du hättest etwas lernen sollen, das nicht streng getippt ist.

Im Allgemeinen habe ich Sie so verstanden, dass Sie Ihre eigene untypisierte Sprache auf der Grundlage von MQL erfunden haben. Die strenge Typisierung wurde durch die Verwendung von Strings umgangen. Das ist ein Manöver!

 
Vasiliy Sokolov:

Oh, Peter, du hast mit der falschen Programmiersprache angefangen. Du hättest etwas lernen sollen, das nicht streng getippt ist.

Im Allgemeinen habe ich Sie so verstanden, dass Sie Ihre eigene untypisierte Sprache auf der Grundlage von MQL erfunden haben. Die strenge Typisierung wurde durch die Verwendung von Strings umgangen. Das ist ein Manöver!

Ja,)) Ein Schachzug mit einem Springer!

 

Wenn Sie eine Tabelle verwenden, müssen Sie entscheiden, ob die Daten in der Tabelle rein numerisch oder textuell sein sollen. Bei Text geben Sie Zeichenketten ein. Wenn es echt ist, muss Ihre Funktion wie folgt aussehen:

string E_Last_10_bars_2_Close_price(double n,  int Property = -1){return(GET_N_SET(11,n,Property));}