Beta-Version des Online-Buchs über MQL4-Programmierung - von Sergey Kovalev (SK.) - Seite 10

 
Entschuldigung, ich habe es gefunden!
Ja, das Handbuch ist wirklich cool, aber um auf meine frühere Anfrage zurückzukommen - es muss griffbereit sein, um schnell nachschlagen zu können.
Im Idealfall sollte sie die Standardhilfe in neuen Versionen von MT ersetzen.
 

an SK

double my_search_and_etc()
{ double summ[]; //Array innerhalb der Funktion
//.........
i=ArrayMinimum(summ,iter,0); // Tracer: <Inkorrierte Startposition 0 für ArrayMinimum-Funktion>

//zweite Fehlervariante
static double summ[]; //
//.........
i=ArrayMinimum(summ,iter,0); // Tracer: <Inkorrierte Startposition 0 für ArrayMinimum-Funktion>
//d.h. Fehler der dynamischen Adressierung des ersten Elements des Arrays beim zweiten Tick
//.......................

//........................
//rechte Zeit
double summ[1000]; //specifying of explicit size impliziert Typ static
//.........
i=ArrayMinimum(summ,iter,0); // O.k.
//rechts zwei
static double summ[1000]; //Rückversicherung auf explizite Größe
//.........
i=ArrayMinimum(summ,iter,0); // O.k.
}

 
Nein, Sie brauchen die Standardhilfe nicht zu ersetzen. Behalten Sie es. Die Entwickler normaler Sprachsoftware trennen die Sprachbeschreibung von den verschiedenen Tutorials für die Sprache.
 
Korey:

an SK


Ich bin mir nicht ganz sicher, wie Ihre Frage lautet. Handelt es sich bei der Zeichenfolge, die Sie darstellen, um einen vollständigen Code (warum wird dann die Initialisierung wiederholt?) oder um eine zusammenhanglose Zeichenfolge (warum sind dann geschweifte Klammern vorhanden?). Reichen Sie den fertigen Code ein und formulieren Sie die Frage. Verwenden Sie die Schaltfläche MQL (in der obersten Zeile des Bearbeitungsfensters), um den Code zu veröffentlichen.
 
Renat:
Herzlichen Glückwunsch an Sergei Kovalev!

Die Veröffentlichung des MQL4-Tutorials ist für den 1. Februar geplant, und es wurde bereits in die MQL4.community-Website integriert. Die Übersetzung ins Englische ist in vollem Gange.

Vielen Dank für Ihre Glückwünsche, Renat.

Ich möchte diese Gelegenheit nutzen, um Ihnen noch einmal zu sagen, dass es eine große Ehre für mich ist, das MQL4-Tutorial auf der Website der MetaQuotes Software Corp. zu veröffentlichen. Ich danke Ihnen aufrichtig für Ihr Vertrauen, Ihre Unterstützung und Ihren Zuspruch. Ich danke auch Stanislav Starikov und Rashid Umarov von MetaQuotes Software Corp. für ihre wertvollen Ratschläge und ihre Hilfe bei der Vorbereitung des Lehrbuchs.

 
an SK
Der Artikel zeigt 4 Varianten der Array-Initialisierung mit ein und demselben Aufruf vonArrayMinimum();
Es wird gezeigt, dass die Initialisierung eines Arrays in einem Unterprogramm ohne Angabe der Array-Größe [] zu dem "RunTime"-Fehler führt
- Bei den ersten beiden Varianten wird der Fehler in der Übersetzung zitiert: "incorrect ADDRESS of the beginning of the array".
-Zwei Varianten funktionieren, es wird gezeigt, dass die Angabe einer Dimensionalität von [1000] das Array automatisch statisch macht.
Schlussfolgerungen:
1) MQL4-Arrays sind nicht immer statisch,
2) Die Definition von statischen a[], d. h. ohne explizite Dimensionalität, funktioniert nicht, aber es wird keine Fehlermeldung ausgegeben. Der Fehler wird zur Laufzeit beim zweiten und jedem weiteren Tick im Expert Advisor-Fenster angezeigt.
3) Beschriebene Fehler der Statik/Dynamik erscheinen, wenn das Array in der Sub/Func definiert ist, und werden nur von denjenigen erkannt, die im Fenster "Expert Advisors" nachschauen,
und erst, wenn der zweite Tick kommt. Der Fehler wird zum Beispiel nicht entdeckt, wenn der Indikator am Wochenende ohne Verwendung des Strategietesters getestet wird.
4) Die Lehrbuchzeile "MQL4-Arrays sind immer statisch" kann sich auf frühere Builds beziehen.
 

Ich würde gerne zusätzlich zu den Texttutorials eine Reihe von Video-Tutorials haben. Eine Reihe von Video-Tutorials haben. Vor allem fehlt eine allererste Lektion - wie man das Programm herunterlädt, installiert und den ersten Buy- oder Shell-Handel durchführt.

 
Korey:
an SK
Der Artikel zeigt 4 Versionen der Initialisierung eines Arrays mit ein und demselben Aufruf vonArrayMinimum();
Es wird gezeigt, dass die Initialisierung eines Arrays in einem Unterprogramm ohne Angabe der Array-Größe [] zu dem "RunTime"-Fehler führt
- Bei den ersten beiden Varianten wird der Fehler in der Übersetzung zitiert: "incorrect ADDRESS of the beginning of the array".
-Zwei Varianten funktionieren, es wird gezeigt, dass die Angabe einer Dimensionalität von [1000] das Array automatisch statisch macht.
Schlussfolgerungen:
1) MQL4-Arrays sind nicht immer statisch,
2) Die Definition von statischen a[], d. h. ohne explizite Dimensionalität, funktioniert nicht, aber es wird keine Fehlermeldung ausgegeben. Der Fehler wird zur Laufzeit beim zweiten und jedem weiteren Tick im Expert Advisor-Fenster angezeigt.
3) Beschriebene Fehler der Statik/Dynamik erscheinen, wenn das Array in der Sub/Func definiert ist, und werden nur von denjenigen erkannt, die im Fenster "Expert Advisors" nachschauen,
und erst, wenn der zweite Tick kommt. Zum Beispiel wird der Fehler nicht entdeckt, wenn der Indikator am Wochenende ohne Verwendung des Strategietesters getestet wird.
4) Die Lehrbuchzeile "MQL4-Arrays sind immer statisch" kann sich auf frühere Builds beziehen.


Ihre Argumentation ist nicht sehr klar. Sie deklarieren ein dimensionsloses Array (das Programm hat nur den Namen des Arrays, dessen Elemente nicht definiert sind und für das kein Speicher zugewiesen wird) und versuchen, mit der Funktion ArrayMinimum() den Mindestwert unter den nicht vorhandenen Elementen zu finden. Natürlich tritt der Fehler unabhängig davon auf, ob das Array als statisch deklariert ist oder nicht, und Sie sollten den Ausführungsfehler als Hinweis auf die Eigenschaft des Arrays, statisch zu sein oder nicht, betrachten.

Arrays in MQL4 sind per Definition statisch. Es bedeutet (außer natürlich, es befindet sich mindestens ein Element im Array), dass die Arrayelemente ab dem letzten Beenden der Funktion (die das Array deklariert hat) bis zum nächsten Aufruf gespeichert werden, unabhängig davon, ob dem Arraybezeichner das Schlüsselwort static vorangestellt ist oder nicht.

 
zu SK
Was kümmert mich das, wir verwenden diese Speicherzuweisungstricks schon seit langem.
Ich habe nicht über den Inhalt des Arrays geschrieben, sondern über seine Adressierung, dass es keine Kompilierungsfehler, keine Linking-Fehler, aber einen ADDRESS PRINTY ERROR gibt.
Das heißt, der Compiler hat mir erlaubt, ein Array [] in einer Subroutine zu definieren, um es später zu vergrößern - das ist gut (!),
es ist dynamische Speicherzuweisung durch Array.
Alle Zeiger auf dieses Array werden jedoch als direkte Zeiger verknüpft (aber nicht als Zeiger auf Zeiger),
was zu einer Fehlanpassung zwischen den verknüpften statischen Adressen und der neu zugewiesenen Array-Adresse führt, wenn die dynamische Speicherzuweisung folgt.
Das heißt, der Array (Pointer)-Referenz in MQL4 ist jetzt statisch, und es funktioniert nur korrekt, wenn das Array wirklich statisch ist.
Der Compiler versteht nicht, dass das Array in der Zukunft ohne die explizite Angabe der Größe innerhalb des Unterprogramms verschoben werden soll.
Der Programmierer setzt statisch und denkt, dass alles korrekt ist, aber wenn er keine explizite Größe angibt, gibt es kein statisches Array, und das Array wird sich tatsächlich als dynamisch erweisen (keine Kompilierungs-/Ladefehler).
Das Problem ist nicht so groß, denn in der Regel werden Arrays auf globaler Ebene gespeichert.
Aber es ist wünschenswert, im Tutorial nicht zu schreiben, dass angeblich alle Arrays bereits statisch sind, sondern dass man lokale Arrays statisch mit einer expliziten Größe schreiben sollte.
 
Korey:
an SK
Der Programmierer setzt statisch und denkt, dass alles korrekt ist, aber wenn er keine explizite Größe angibt, gibt es kein statisches Array, und das Array wird sich tatsächlich als dynamisch erweisen (keine Kompilierungs-/Ladefehler).

Ein Programmierer, der weiß, dass alle Arrays in MQL4 statisch sind, wird statisch nicht einfügen, einfach weil es nicht notwendig ist.

Es ist jedoch wünschenswert, in der Anleitung nicht zu schreiben, dass angeblich alle Arrays bereits statisch sind, sondern dass lokale Arrays als statisch mit einer expliziten Größe angegeben werden sollten.

Vielleicht haben Sie die Begriffe verwechselt. In diesem Fall bedeutet "statisch" die Eigenschaft, Werte von Array-Elementen im Intervall zwischen den Ausführungen der Funktion, in der sie deklariert ist, zu speichern. Arrays behalten ihre Werte während dieser Zeit immer bei, unabhängig davon, dass sie static vor dem Namen haben (dies gilt jedoch nicht für lokale Variablen; sie müssen ausdrücklich als static deklariert werden).

Es ist jedoch möglich, die Größe eines Arrays in der ersten Dimension mit ArrayResize() zu ändern.