Die Zukunft von MQL5 ist MQL5+ oder sogar MQL6 - Seite 11

 
Alexey Kozitsyn:

Sie haben alles genau durchdacht. Verwenden Sie eine NULL-Konstante.

Ich verrate Ihnen ein Geheimnis: Es ist bereits umgesetzt. Sie müssen auf das Mausrad klicken, und es erscheint ein Fadenkreuz.

Das kann man schon lange tun. Ziehen Sie den Indikator aus dem Navigator auf das Fenster, in dem der Indikator bereits angebracht ist.

IMHO ist das nicht unbedingt notwendig.

Sie haben einen Navigator, Sie haben Favoriten, Sie haben Vorlagen, Sie haben Profile. Alles kann eingerichtet werden. Lesen Sie die Hilfe für das Terminal, Sie werden eine Menge entdecken!

Aufzählungen werden verwendet, um den Code lesbarer zu machen, um Konstanten zu entfernen und sie durch bekannte Entitäten zu ersetzen.

Zum Beispiel können die Werte der Aufzählung ENUM_DAY_OF_WEEK zum Vergleich mit dem Wert day_of_week der Struktur MqlDateTime verwendet werden. Das heißt, Sie können es wie folgt schreiben

Oder Sie können es anders schreiben:

SUNDAY ist eine benannte Konstante vom Typ int mit dem Wert 0.

Was meinen Sie, wie wird es für eine Person, die den Code liest, klarer sein?

Super! Vielen Dank für das Navigationsgerät! Ich habe ihm nicht viel Aufmerksamkeit geschenkt. Normalerweise schalte ich sie aus, damit sie nicht zu viel Speicherplatz beansprucht. Die Hilfe, und sei es nur ein flüchtiger Blick, habe ich gelesen. Es sagt mir nichts über das Ziehen eines indirekten in das Fenster der Diagramme und übereinander. Obwohl, ich hätte es erraten und versuchen können....)))

Vielen Dank für die Erläuterung der Art der Aufzählungen! Ich habe sie sehr schnell gelesen, MQL ist größtenteils von C++ abgeleitet, und es gibt eine Vielzahl von Docks dafür. Aber eine Menge Druckfehler in der Hilfe und unvollständige Artikel sind nicht gut.

Ergebnisse: eine korrekt geschriebene Hilfe kann helfen, viele dumme Fragen von Dummköpfen im Forum zu vermeiden!

Was die NULL betrifft, so ist sie gleich Null - sie wird sehr häufig verwendet. Aber Höchstwerte von Variablen sind sehr selten, fast nie. Zum Beispiel speichert eine Variable nach der Analyse von Indikatoren drei Zustände: KAUFEN, VERKAUFEN oder NULL. Wenn wir die vorgefertigten Konstanten POSITION_TYPE_BUY und POSITION_TYPE_SELL verwenden, ist eine davon Null. Ich bin sicher, dass EMPTY_VALUE beliebter sein wird als NULL, wenn man es auf alle Typen verallgemeinert).

 
Alexander Puzanov:

Es gibt eine weitere unendlich nützliche Anwendung. Zum Beispiel:

Und der Nutzer erhält eine Dropdown-Liste mit einer Auswahl von 4 Punkten, die Sie in den Kommentaren angegeben haben - "Nur kaufen", "Nur verkaufen" usw. Sehr nützlich für die Auflistung einer Reihe von Indikatoren, Zeitrahmen, Bedingungen usw. im Fenster mit den Benutzereinstellungen

Ja, natürlich! In diesem Fall können wir auch hinzufügen, dass es den Mechanismus der Überprüfung der vom Benutzer eingegebenen Werte durch das Programm vereinfacht. D.h. es werden zunächst alle (richtigen Werte) beschrieben.
 
agvozdezkiy:

Der NULL-Teil ist Null, und er wird häufig verwendet. Zum Beispiel speichert die Variable nach der Analyse der Indikatoren drei Zustände: KAUFEN, VERKAUFEN oder NULL. Wenn wir fertige Konstanten POSITION_TYPE_BUY, POSITION_TYPE_SELL verwenden, ist eine davon NULL.

Kein Problem, Sie können es auch so machen:

#define  VALUE_EMPTY -1       // Пустое значение для числовых типов данных
#define  STR_VALUE_EMPTY ""   // Пустое значение для строкового типа

Und stellen Sie sie auf, wo immer Sie wollen.

 
Alexey Kozitsyn:

Kein Problem, Sie können es auch so machen:

Und stellen Sie ihn dort auf, wo Sie ihn haben wollen.

Das ist alles verständlich. Das ist nicht das, was ich meine.
 
agvozdezkiy:
All dies ist klar. Das ist nicht das, was ich meine.

Erklären Sie dann, was Sie meinen? Eine einzige Konstante für alle vordefinierten Datentypen? Es ist unwahrscheinlich, dass so etwas umgesetzt wird.

 
Renat Fatkhullin:

Leider verstehen nur erfahrene Programmierer die Nützlichkeit und Bedeutung einer solchen Warnung.

Nun, ich empfehle allen anderen, sich über diese Hilfe des Compilers zu freuen und ihre eigenen Fehler zu beheben. Dies sind echte Fehlerquellen, und gerade für unerfahrene Entwickler ist es von entscheidender Bedeutung, dies zu lernen.

Können Sie den Namensraum erstellen? Dann wäre das Problem auch gelöst.
 

Das Thema "rein virtuelle Methoden" wurde bereits vor einigen Jahren in diesem Forum angesprochen.

D.h. im C++ Konzept, virtuelle Methoden ohne Körper, die in Nachkommen überschrieben werden MÜSSEN:

virtual void Func1() = 0;

Darüber hinaus wird eine Klasse, die solche Methoden enthält, automatisch abstrakt. Der Compiler verfolgt auch dies. (Nun, es geht nur darum, sich an die Standards zu halten, auch wenn man den Konstruktor in einem geschützten Bereich verstecken kann).

Wir vermissen derzeit eine Menge an "rein virtuellen Methoden". Ohne eine solche Funktionalität kann man eine Bibliothek oder ein Framework nicht richtig darauf vorbereiten, sie auszulagern: Man erstellt eine eigene Kindklasse (die nicht umsonst ist, sondern wie ein Rädchen in andere Klassen eingebettet ist) und ist so freundlich, die gesamte Schnittstelle zu implementieren. Wenn man nun erbt und keine Methodenimplementierung einfügt, verschluckt der Compiler sie und nichts funktioniert. Sich durch den Quellcode der übergeordneten Klasse wühlen?

Das Konzept der Schnittstelle ist eine der Grundlagen der OOP. Daher würde ich wirklich gerne sehen, die Umsetzung einer solchen Sache in 5, und nicht in MQL6

Übrigens, in der Dokumentation zu den virtuellen Funktionen gibt es einen Fehler

Виртуальная функция, как и обычная функция, должна иметь исполняемое тело. При вызове семантика ее точно такая же, как и у остальных функций.

Beispiel:

class Base {
private:
        int a;
public:
        virtual int Func1();
};


class Second: public Base {
public:
        int Func2() {
                return 0;
        };      
};

int OnInit() {

        Base* base = new Base();
        Second* foo = new Second();
   return(INIT_SUCCEEDED);
}

Die virtuelle FunktionFunc1 hat keinen ausführbaren Körper (und gibt nicht einmal einen Wert zurück), lässt sich aber fehlerfrei kompilieren.

 
Igor Volodin:

Das Thema "rein virtuelle Methoden" wurde bereits vor einigen Jahren in diesem Forum angesprochen.

D.h. im C++-Konzept, virtuelle Methoden ohne Körper, die in Nachkommen überschrieben werden MÜSSEN:

Darüber hinaus wird eine Klasse, die solche Methoden enthält, automatisch abstrakt. Der Compiler verfolgt auch dies. (Nun, es geht nur darum, sich an die Standards zu halten, auch wenn man den Konstruktor in einem geschützten Bereich verstecken kann).

Wir vermissen derzeit eine Menge an "rein virtuellen Methoden". Ohne eine solche Funktionalität kann man eine Bibliothek oder ein Framework nicht richtig darauf vorbereiten, sie auszulagern: Man erstellt eine eigene Kindklasse (die nicht umsonst ist, sondern wie ein Rädchen in andere Klassen eingebettet ist) und ist so freundlich, die gesamte Schnittstelle zu implementieren. Wenn man nun erbt und keine Methodenimplementierung einfügt, verschluckt der Compiler sie und nichts funktioniert. Sich durch den Quellcode der übergeordneten Klasse wühlen?

Das Konzept der Schnittstelle ist eine der Grundlagen der OOP. Daher würde ich wirklich gerne sehen, die Umsetzung einer solchen Sache in 5, und nicht in MQL6

Übrigens, in der Dokumentation zu den virtuellen Funktionen gibt es einen Fehler

Beispiel:

Die virtuelle FunktionFunc1 hat keinen ausführbaren Körper (und gibt nicht einmal einen Wert zurück), lässt sich aber fehlerfrei kompilieren.

1. Rein virtuelle Funktionen werden demnächst hinzugefügt

2. wo in Ihrem Beispiel befindet sich der Aufruf von Func1? Kein Anruf - keine Körperkontrolle.

 
Slawa:

1. Rein virtuelle Funktionen werden demnächst hinzugefügt

2. wo ist der Aufruf von Func1 in Ihrem Beispiel? Kein Anruf - auch keine Körperkontrolle.

VS 2015 sagte Folgendes

Schweregrad Code Beschreibung Projekt Datei Zeile Unterdrückungsstatus

Fehler LNK2001 nicht aufgelöstes externes Symbol "public: virtual int __thiscall Base::Func1(void)" (?Func1@Base@UAEHXZ) TestCPPCode C:\MyP\AvForex\trunk\TestCPPCode.obj 1

Fehler LNK1120 1 nicht aufgelöste Externals TestCPPCode C:\MyP\AvForex\trunk\MQL4FilesForFormatting2015\Debug\TestCPPCode.exe 1

 
Alexey Volchanskiy:

VS 2015 sagte Folgendes

Schweregrad Code Beschreibung Projekt Datei Zeile Unterdrückungsstatus

Fehler LNK2001 nicht aufgelöstes externes Symbol "public: virtual int __thiscall Base::Func1(void)" (?Func1@Base@UAEHXZ) TestCPPCode C:\MyP\AvForex\trunk\TestCPPCode.obj 1

Fehler LNK1120 1 nicht aufgelöste Externals TestCPPCode C:\MyP\AvForex\trunk\MQL4FilesForFormatting2015\Debug\TestCPPCode.exe 1

Quellcode anzeigen
Grund der Beschwerde: