Einzelne Array-Berechnung während der Optimierung - Seite 6

 
Alexey Viktorov:

Hier ist ein Beispiel für das Schreiben und Lesen eines Arrays

Führen Sie es zweimal im Debug-Modus aus und sehen Sie, wie lange es dauert, das Array zu schreiben und zu lesen. Der erste Durchlauf schreibt das Array in eine Datei, der zweite liest es und beginnt mit dem Ausdruck von Daten aus dem Array. Dann finden Sie heraus, ob IS_DEBUG_MODE entfernt und IsOptimization() in die Bedingung eingefügt werden soll.

Danke!
 
Dmitry Fedoseev:

Es gibt eine Funktion, so etwas wie FileWriteInteger(). Die Variable muss am Anfang der Datei stehen, nach dem Lesen bewegt sich der Zeiger an ihr Ende, d.h. an den Anfang des Arrays, nach dem Lesen des Arrays steht der Zeiger vor der nächsten Variablen...

Ein Artikel über die Arbeit mit Dateien wird demnächst veröffentlicht.

Ich wollte Ihnen schreiben, dass es keinen Artikel über Dateivorgänge gibt. Sie machen sie informativ und anschaulich, ich werde sie auf jeden Fall lesen, wenn sie erscheinen.

 

Versucht , ein Array auf globaler Ebene zu deklarieren (mql4-Code)

datetime T[];

Füllen Sie es in das Feld

ArrayResize(T,40);
datetime T[40]=
   {
   1262731020,1262735700,1262821920,1262903400,1262989740,1263247200,1263339060,1263420000,1263507480,1263595500,
   1265324700,1265407200,1265752980,1265926500,1265930820,1267657200,1267740300,1267826460,1268175840,1268346360,
   1270504920,1270684140,1270768500,1272924180,1273011720,1273097100,1273272240,1273528800,1273617180,1275344100,
   1275516000,1275602400,1275689160,1276034400,1276124580,1276208700,1276211640,1278027960,1278369780,1278373920
   };

Wenn es beim Start nicht gesetzt ist, wird das Datum 1971 gedruckt, d.h. das Feld ist leer.

for (int x=0;x<=39;x++)
   {
   Print("T[x]=",T[x],"x=",x);   
   }

Wenn ich das Feld am Anfang fülle, erscheinen die Werte. Vielleicht liegt es daran, dass das Array zu einem bestimmten Zeitpunkt neu initialisiert wird, aber ohne dieses Array lässt sich der Code nicht kompilieren?

Das Feld verschwindet. Was mache ich falsch?

 
forexman77:

Versucht , ein Array auf globaler Ebene zu deklarieren (mql4-Code)

Füllen Sie es in das Feld

Wenn es beim Start nicht gesetzt ist, wird das Datum 1971 gedruckt, d.h. das Feld ist leer.

Wenn ich das Feld am Anfang fülle, erscheinen die Werte. Vielleicht liegt es daran, dass das Array zu einem bestimmten Zeitpunkt neu initialisiert wird, aber ohne dieses Array lässt sich der Code nicht kompilieren?

Das Feld verschwindet. Was mache ich falsch?

Schauen Sie, was der Compiler sagt.

ArrayResize(T,40);
datetime T[40]=

Mit einer solchen einfachen Bewegung haben Sie ein lokales Array T definiert, das beim Verlassen von OnInit verschwindet...

 
Maxim Kuznetsov:

überprüfen Sie die Warnung, die der Compiler erzeugt.

Mit einer solchen einfachen Bewegung haben Sie ein lokales Array T definiert, das verloren geht, wenn Sie OnInit beenden...

Es heißt, dass es bereits eine globale Erklärung gibt)

Deklaration von 'T' verdeckt globale Deklaration in Zeile 40

Aber wie macht man es richtig? Ich hatte noch nie ein Array mit geschweiften Klammern deklariert. Ich habe sie mit Null initialisiert und ihre Größe festgelegt und sie dann mit der Schleife gefüllt. Gibt es eine andere Möglichkeit, dies zu tun?

Wenn ich die Datetime in der Inite lösche, kompiliert der Code nicht, sondern schreibt zwei Fehler:

'{' - Ausdruck erwartet

=' - Verwendung einer unzulässigen Operation



 
forexman77:

Es heißt, dass es bereits eine globale Erklärung gibt)

Deklaration von 'T' verdeckt globale Deklaration in Zeile 40

Aber wie macht man es richtig? Ich hatte noch nie ein Array mit geschweiften Klammern deklariert. Ich habe sie mit Null initialisiert und ihre Größe festgelegt und sie dann mit der Schleife gefüllt. Gibt es eine andere Möglichkeit, dies zu tun?

Wenn ich die Datetime in der Inite lösche, kompiliert der Code nicht, sondern schreibt zwei Fehler:

'{' - Ausdruck erwartet

=' - Verwendung einer unzulässigen Operation



Die Array-Deklaration zusammen mit der Initialisierung der Konstanten könnte (und sollte) auf der globalen Ebene erfolgen.

datetime T[40]=
   {
   1262731020,1262735700,1262821920,1262903400,1262989740,1263247200,1263339060,1263420000,1263507480,1263595500,
   1265324700,1265407200,1265752980,1265926500,1265930820,1267657200,1267740300,1267826460,1268175840,1268346360,
   1270504920,1270684140,1270768500,1272924180,1273011720,1273097100,1273272240,1273528800,1273617180,1275344100,
   1275516000,1275602400,1275689160,1276034400,1276124580,1276208700,1276211640,1278027960,1278369780,1278373920
   };
void OnInit() 
{
 ....
}
 
forexman77:

Es heißt, dass es bereits eine globale Erklärung gibt)

Deklaration von 'T' verdeckt globale Deklaration in Zeile 40

Aber wie macht man es richtig? Ich hatte noch nie ein Array mit geschweiften Klammern deklariert. Ich habe sie mit Null initialisiert und ihre Größe festgelegt und sie dann mit der Schleife gefüllt. Gibt es eine andere Möglichkeit, dies zu tun?

Wenn ich die Datetime in der Inite lösche, kompiliert der Code nicht, sondern schreibt zwei Fehler:

'{' - Ausdruck erwartet

=' - Verwendung einer unzulässigen Operation



Mit '=' können Sie Arrays nur bei der Deklaration initialisieren. Es scheint ein Überbleibsel von C zu sein, aber so wird es hier gemacht :-)
 
Maxim Kuznetsov:

Die Array-Deklaration zusammen mit der Initialisierung der Konstanten hätte auf globaler Ebene erfolgen können (und sollen).

Ja, ich habe es ausprobiert und es funktioniert. Und das geht nicht ohne globale Ebene, ich habe es nur gemacht, um den Rechenaufwand zu reduzieren, das Array einmal im Init zu füllen und dann die Arraywerte zu verwenden?

Obwohl die Variablen auf der globalen Ebene logischerweise immer konstant sind, so dass die Berechnung einmal zu Beginn des Programms durchgeführt wird?

 
forexman77:

Ja, ich habe es ausprobiert und es funktioniert. Und das geht nicht ohne globale Ebene, ich habe es nur gemacht, um den Rechenaufwand zu reduzieren, das Array einmal im Init zu füllen und dann die Arraywerte zu verwenden?

Obwohl die Variablen auf der globalen Ebene logischerweise immer konstant sind, wird die Berechnung also einmal zu Beginn des Programms durchgeführt?

Ja, bei der Vorbereitung einer ex4 ex5-Binärdatei zur Ausführung durch das Terminal. Man kann sich vorstellen, dass es sich nur um Links zu dem beschriebenen (und in ex4/5 zur Kompilierzeit gespeicherten) Datenfeld handelt, und das ist sehr schnell...
 
forexman77:

Es heißt, dass es bereits eine globale Erklärung gibt)

Deklaration von 'T' verdeckt globale Deklaration in Zeile 40

Aber wie macht man es richtig? Ich hatte noch nie ein Array mit geschweiften Klammern deklariert. Ich habe sie mit Null initialisiert und ihre Größe festgelegt und sie dann mit der Schleife gefüllt. Gibt es eine andere Möglichkeit, dies zu tun?

Wenn ich die Datetime in der Inite lösche, kompiliert der Code nicht, sondern schreibt zwei Fehler:

'{' - Ausdruck erwartet

=' - Verwendung einer unzulässigen Operation



Es spielt keine Rolle, wie das Feld gefüllt wird. Sie müssen lediglich eine Bedingung festlegen, die besagt, dass das Array ausgewertet, gefüllt und in eine Datei geschrieben werden soll, wenn seine Größe Null ist. Und in OnInit(), versuchen Sie, in das deklarierte Array mit meinem Beispiel zu lesen. Wenn also ein Datei-Array vorhanden ist, es gelesen wird und das Array gefüllt ist, wird das Array nicht neu berechnet und erneut gefüllt.
Grund der Beschwerde: