Diskussion zum Artikel "Erweiterte Variablen und Datentypen in MQL5"

 

Neuer Artikel Erweiterte Variablen und Datentypen in MQL5 :

Variablen und Datentypen sind nicht nur in der MQL5-Programmierung, sondern auch in jeder anderen Programmiersprache ein sehr wichtiges Thema. MQL5-Variablen und -Datentypen können in einfache und erweiterte Typen unterteilt werden. In diesem Artikel werden wir die fortgeschrittenen identifizieren und kennenlernen, denn die einfachen haben wir bereits in einem früheren Artikel erwähnt.

In diesem Artikel werden wir mehr über Variablen und Datentypen in MQL5 erfahren und wie sie bei der Erstellung oder dem Aufbau von MQL5-Handelssoftware nützlich sein können. Wir werden mehr über einige fortgeschrittene Konzepte von Variablen und Datentypen erfahren und diese anhand der folgenden Themen behandeln:

  • Konstanten: Sie sind Bezeichner, deren Werte unverändert bleiben.
  • Arrays: Sie sind jede Art von Variablen mit mehreren Werten. 
  • Enumerationen: Sie sind ganzzahlige Listen von Konstanten mit ganzzahligen Werten.
  • Strukturen: Es handelt sich um eine Reihe von zusammenhängenden Variablen unterschiedlichen Typs.
  • Typecasting: Dies ist der Prozess der Umwandlung eines Wertes in einen anderen.
  • Lokale Variablen: Sie sind lokal deklarierte Variablen innerhalb von Funktionen.
  • Globale Variablen: Sie sind global deklarierte Variablen außerhalb von Funktionen.
  • Statische Variablen: Es handelt sich um deklarierte lokale Variablen, die ihre Werte im Speicher beibehalten.
  • Vordefinierte Variablen: Sie wurden vom Ersteller der Programmiersprache vordefiniert.


    Autor: Mohamed Abdelmaaboud

     
    MetaQuotes:

    Sehen Sie sich den neuen Artikel an: Erweiterte Variablen und Datentypen in MQL5.

    Autor: Mohamed Abdelmaaboud


    Ich stimme nicht ganz zu, dass eine Präprozessor-Direktive im Zusammenhang mit const-Variablen erwähnt werden kann.

    Das Schlüsselwort const hat eine andere Wirkung als ein #define "constant".

    const kann in Funktionssignaturen sehr nützlich sein, da es die Übergabe der Parameterwerte in einen Nur-Lese-Modus versetzt. const ist ein Schlüsselwort, das speziell für den Programmierer entwickelt wurde. Es gibt keine Darstellung in der vom Compiler erzeugten ausführbaren Binärdatei.

    Im Gegensatz zu einer const-Variable handelt es sich bei einer #define-Anweisung um einen so genannten r-Wert, der sich später in der ausführbaren Binärdatei in einem schreibgeschützten Speicherbereich befindet und daher eigentlich nicht verändert werden kann.

    Außerdem ist #define eine Präprozessoranweisung und ersetzt eigentlich nur alle Vorkommen in der Quelldatei. Dies geschieht, bevor der Compiler den zu kompilierenden Code überhaupt zu Gesicht bekommt.

    Außerdem ist die #define-Direktive nicht global, sondern kann überall in der Quelldatei vorkommen. Auf der Stufe des Präprozessors ist das Konzept der Code-Blöcke "{...}" nicht verfügbar und wird auch nicht ausgewertet.

    Die Sichtbarkeit von Variablen wird durch Codeblöcke definiert. Sie können auf jeder Ebene Codeblöcke definieren, wie Sie wollen, außer auf globaler Ebene. Auf globaler Ebene benötigen Sie eine "Entität", zu der dieser Block gehört. Funktion, Klasse, Struktur oder Namespace.

    Innerhalb eines solchen "benannten" Blocks können beliebig viele Blöcke kaskadiert werden, wobei die Sichtbarkeit immer nur innerhalb der gleichen Ebene oder innerhalb der enthaltenen/untergeordneten Blöcke gegeben ist.

    Statische Variablen befinden sich im globalen Speicherbereich, der einem Programm zugewiesen ist. Die Sichtbarkeit dieser Variablen wird durch den Codeblock bestimmt, in dem sie deklariert/definiert wurde. Dies kann auch der globale Speicher sein. Eine im globalen Speicher deklarierte/definierte Variable hat ein implizites Schlüsselwort "static". Die explizite Erwähnung dieses Schlüsselworts ändert nichts am Verhalten dieser Variablen.

    Ich vermisse das Schlüsselwort "extern" in Ihrem Artikel, ebenso wie "input". Ich denke, dass diese Teil sein sollten.

    Wie auch immer, ich denke, es ist ein guter Artikel, vor allem für Anfänger, da das Konzept der Variablen manchmal am Anfang schwer zu verstehen ist, und viele Fehler vermieden werden können, wenn sie richtig implementiert werden.

    Vielleicht machen Sie mit einer Fortsetzung weiter, es wäre schön, wenn Sie etwas über das Definieren, Deklarieren und Initialisieren von Variablen und den Speicher hinzufügen könnten. Vielleicht auch auf die Fallstricke hinweisen, wenn man es nicht richtig macht.

    Und um noch mehr Einblick zu bekommen, vielleicht ein paar erweiterte Details über Stack, Reihenfolge der Variablen, MSB vs LSB, Speicheradressierung.... Ok, vielleicht ist das zu weit hergeholt.
     
    Dominik Egert #:

    Ich bin nicht der Meinung, dass eine Präprozessorrichtlinie im Zusammenhang mit const-Variablen erwähnt werden kann.

    Das Schlüsselwort const hat eine andere Wirkung als #define "constant".

    const kann in Funktionssignaturen sehr nützlich sein, weil es den Wert von Parametern in den Nur-Lese-Modus versetzt. const ist ein Schlüsselwort, das speziell für den Programmierer geschaffen wurde. Es hat keine Repräsentation in der vom Compiler erzeugten ausführbaren Binärdatei.

    Im Gegensatz zur const-Variable repräsentiert der #define-Operator einen so genannten r-Wert, der sich in einer weiteren ausführbaren Binärdatei an einer schreibgeschützten Speicherstelle befindet und daher eigentlich nicht verändert werden kann.

    Außerdem ist #define eine Präprozessor-Stufenanweisung, die eigentlich nur alle Vorkommen in der Quelldatei ersetzt. Dies geschieht, bevor der Compiler den kompilierten Code überhaupt zu Gesicht bekommt.

    Außerdem hat die #define-Direktive nicht denselben "Ort" wie eine globale Direktive, sie kann überall in der Quelldatei erscheinen. In der Präprozessorphase steht das Konzept der "{...}"-Codeblöcke nicht zur Verfügung und wird nicht ausgewertet.

    Die Sichtbarkeit von Variablen wird durch Codeblocks bestimmt. Sie können Codeblöcke auf jeder Ebene beliebig definieren, außer auf der globalen Ebene. Auf der globalen Ebene benötigen Sie eine "Entität", zu der der Block gehört. Eine Funktion, Klasse, Struktur oder ein Namespace.

    Innerhalb eines solchen "benannten" Blocks können beliebig viele Blöcke kaskadiert werden, wobei die Sichtbarkeit immer nur innerhalb von Blöcken der gleichen Ebene oder inkludierten/untergeordneten Blöcken gegeben ist.

    Statische Variablen befinden sich in dem für das Programm zugewiesenen globalen Speicherplatz. Die Sichtbarkeit dieser Variablen wird durch den Codeblock bestimmt, in dem sie deklariert/definiert wurde. Dies kann auch ein globaler Speicherplatz sein. Eine im globalen Speicherbereich deklarierte/definierte Variable hat das implizite Schlüsselwort "static". Seine explizite Erwähnung ändert das Verhalten dieser Variablen in keiner Weise.

    In Ihrem Artikel vermisse ich das Schlüsselwort "extern" sowie "input". Ich denke, sie sollten Teil des Artikels sein.

    Wie auch immer, ich denke, dies ist ein guter Artikel, besonders für Anfänger, da das Konzept der Variablen am Anfang manchmal schwer zu verstehen ist und viele Fehler vermieden werden können, wenn sie richtig implementiert werden.

    Vielleicht setzen Sie den Artikel fort. Es wäre schön, wenn Sie auf die Definition, Deklaration und Initialisierung von Variablen sowie auf den Speicher eingehen würden. Vielleicht weisen Sie auch auf die Fallstricke hin, die bei falscher Anwendung auftreten können.

    Und zum besseren Verständnis vielleicht ein paar fortgeschrittene Details über den Stack, die Reihenfolge der Variablen, MSB vs. LSB, Speicheradressierung..... Okay, vielleicht ist das zu weit.


    Danke für die Informationen. Ich werde versuchen, so viel wie möglich über das zu schreiben, was Sie erwähnt haben.

     
    Dominik Egert #:
    Das Schlüsselwort const hat eine andere Wirkung als ein #define "constant".

    Übrigens gefällt mir die Art und Weise, wie Konstanten in C# implementiert sind (der Compiler ersetzt sie durch Literalwerte).

    https://learn.microsoft.com/en-us/dotnet/csharp/programming-guide/classes-and-structs/constants

    Wenn der Compiler auf einen Konstantenbezeichner im C#-Quellcode stößt, ersetzt er den literalen Wert direkt in dem von ihm erzeugten IL-Code (Intermediate Language). Da einer Konstante zur Laufzeit keine Variablenadresse zugeordnet ist, können const-Felder nicht per Referenz übergeben werden und nicht als l-Wert in einem Ausdruck erscheinen.

    Nach der Tatsache zu urteilen, dass ich in MQL eine Konstante per Referenz übergeben kann, bleiben Konstanten in MQL nach der Kompilierung Variablen.