Merkmale der Sprache mql5, Feinheiten und Techniken - Seite 214

 
fxsaber #:

Ich bin noch nie auf einen solchen Eintrag gestoßen.

Verwenden Sie es)))

 
Vladimir Simakov #:

Verwenden Sie es))))

Vladimir, wo bekommst du solche Schemata her?, mir wurde damals geholfen, in meinem Thema über das Finden von Balken, minimaler Zyklus, gibt es irgendwo ein vorgefertigtes Bild? ich bin Autodidakt, in einem anderen Profil ursprünglich

Logikschaltungen wie diese zusammenzustellen, zu addieren, Zyklen zu durchlaufen...
 
Vladimir Simakov #:

Nun, das ist ein heftiger Fehler. Beispiel:

Speicher wird zugewiesen, der Destruktor wird aufgerufen, wenn er freigegeben wird (was ein Hinweis auf das erwartete Verhalten nach RAII ist), aber der Konstruktor wird vergessen, wenn ein Objekt erstellt wird)))

Dies ist der 2. {}-Fehler.

Zur Erinnerung: 1. mit Schweben, 3. mit Vereinigung

 
Vladimir Simakov #:

Nutzen Sie die Vorteile)))

Oh, diese post-inkrementellen Lakoniken... )
 
Fast235 #:

Vladimir, woher bekommst du solche Schemata?, mir wurde damals, in meinem Thema über die Suche nach Bars, durch einen minimalen Zyklus geholfen, gibt es irgendwo vorgefertigte Bilder? ich bin Autodidakt, in einem anderen Profil ursprünglich

einfach logische Schaltungen zusammenstellen, sie addieren, durch die Zyklen blättern...

Verwenden Sie so etwas nicht von der Stange, ohne es zu verstehen. Mit solchen Aufzeichnungen, wenn Sie etwas ein wenig komplizierter als hier, Fehler, nicht immer leicht zu finden, können Sie im Handumdrehen zu füllen))))

 
Vladimir Simakov #:

Verwenden Sie so etwas nicht von der Stange, ohne es zu verstehen. Mit solchen Aufzeichnungen kann man im Handumdrehen Fehler machen, die nicht immer leicht zu finden sind, wenn man etwas Komplexeres braucht als hier)))

Ihre Suche nach Bars, waren mit Aufzählungen und Vorlagen))

Ich habe die Vorlagen fast ewig vor mir hergeschoben, aber in etwa einer Stunde hatte ich sie im Kasten.

sie zusammen mit den Aufzählungen aus dem Code entfernt haben, hatten Sie wahrscheinlich eine ernstere Aufgabe, sie zu verwenden

--

hinzufügen.

es steht alles im Forum, einfach danke.

 
Vladimir Simakov #:

Nun, das ist ein heftiger Fehler. Beispiel:

Der Speicher wird zugewiesen, der Destruktor wird aufgerufen, wenn er freigegeben wird (was auf das erwartete Verhalten nach RAII hindeutet), aber der Konstruktor wird bei der Erstellung eines Objekts nicht aufgerufen)))

Vielen Dank für diesen Beitrag.
Korrigiert.

Dieser Code verursacht einen Kompilierungsfehler, da die Initialisierungssequenzen in MQL noch unvollständig sind.

Bei Strukturen wird die Initialisierung durch eine Sequenz nicht durch einen Konstruktoraufruf mit entsprechenden Parametern ersetzt - wir planen, dies hinzuzufügen (es ist auf unbestimmte Zeit verschoben, aber einige neue Codes sind in das Produkt "durchgesickert").



 

@A100

Forum zum Thema Handel, automatisierte Handelssysteme und Testen von Handelsstrategien

Eigenheiten von mql5, Tipps und Tricks

A100, 2021.11.16 13:43

Das macht nämlich keinen Sinn:

struct X {
    int i;
};
void OnStart()
{
    X x[200000] = {};
}

F5 legt auf. Außerdem ist dies eine widersprüchliche Lösung.


Forum zum Thema Handel, automatisierte Handelssysteme und Testen von Handelsstrategien

Eigenheiten von mql5, Tipps und Tricks

fxsaber, 2021.11.17 02:07

struct MqlTick2 : private MqlTick {};

void OnStart()
{
  MqlTick2 Ticks[4] = {}; // OK
  
  ZeroMemory(Ticks); // 'Ticks' - not allowed for objects with protected members or inheritance
}

Forum zum Thema Handel, automatisierte Handelssysteme und Testen von Handelsstrategien

Eigenheiten von mql5, Tipps und Tricks

A100, 2021.11.17 02:20

Sie haben den 4. Fehler selbst gemacht. Warum ist ZeroMemory schlechter als {} ? Das heißt, wir haben einen nicht genehmigten Mechanismus für den Zugriff auf Private, den der Compiler aus irgendeinem Grund nicht erkennen kann.

Rechnen Sie damit, dass die Entwickler das Problem nicht beheben werden? Früher hat der Compiler auchnicht aufZeroMemory reagiert.


Wenn Sie sich daran erinnern, dass mql aus C++ hervorgegangen ist, funktionieren diese beiden Beispiele (ihre Gegenstücke) dort gut, weil diese Klassen keine Konstruktoren haben (d.h. einen impliziten Konstruktor):

  • Die Deklaration von ClassX x[n]={}; führt zu einer Wertinitialisierung für jedes Element des Arrays.
  • Wenn ClassX keine benutzerdefinierten Konstruktoren hat (aber einen Standard-Konstruktor, der nicht gesetzt ist), dann wird die Null-Initialisierung der Klassenobjekte durchgeführt - unabhängig davon, ob es private Felder gibt.
  • Aber wenn es Konst-Felder gibt, wird der Standard-Ktor implizit gelöscht, daher Compiler-Fehler.

Beispiel in C++:

#include <iostream>
using namespace std;

class X
{
    int a;
    public:
    int get(){return a;}

    //X(){}   //так массив x не обнуляется
    //а если нет конструктора - то обнуляется
};

int main()
{
    X x[10]={};
    for (int i=0; i<10;i++)   cout<<x[i].get()<<endl;
}

Wenn also keine Konstantenfelder in der Struktur/Klasse vorhanden sind, ist die Logik korrekt.

 
Ich habe vergessen, hinzuzufügen, dass, wenn eine Klasse nicht-triviale Felder (Objekte) hat, ihr Standard-C-Tor nach dem Null-Init des gesamten Objekts für solche Felder aufgerufen wird.
 
fxsaber #:

Einen solchen Rekord habe ich noch nicht gesehen.

Ich habe mir meine Forschung in MQL5 angesehen, es kann noch schlimmer sein, ich pumpe sogar die Geschichte im Indikator um mehrere TFs auf:

void FindHighLow(THL &hl[], const ENUM_TIMEFRAMES tf, const datetime start_time, const int sz_buf = 1000)
{
   ZeroMemory(hl);//hl структура
   datetime st = start_time;
   MqlRates rates[];
   for(int i = 0, c = CopyRates(_Symbol, tf, st, sz_buf, rates); ArraySize(rates) > 0 && i < ArraySize(hl);
         st = rates[0].time - PeriodSeconds(tf), c = CopyRates(_Symbol, tf, st, sz_buf, rates))
   {
        for(int j  = ArraySize(rates) - 1; j >= 0 && i < ArraySize(hl); j--)
      	{
		....	
	}
   }


Ich kann eine Menge Dinge in die for-Anweisung )))) schreiben.