Merkmale der Sprache mql5, Feinheiten und Techniken - Seite 227

 
fxsaber #:
Das ist ein interessantes Ergebnis.

Seltsam, dass es noch nicht behoben wurde:

Forum zum Thema Handel, automatisierte Handelssysteme und Testen von Handelsstrategien

Bugs, Bugs, Fragen

A100, 2020.08.01 05:42

Fehler bei der Ausführung:
template<typename T>
void f( T ) { Print( __FUNCTION__); }
void OnStart()
{
        {
                f<ulong>( 1 );
        }
}

Result: OnStart::unnamed#00000216656562DC80::f<ulong>

Erwartet: OnStart::f<ulong>


 
fxsaber #:
Einschränkung des Compilers.

Dies ist ein offensichtlicher Fehler - ich denke, der Compiler sollte bei solchem Code schon ein Ärzteteam hinzuziehen

Es ist hypothetisch möglich, sich Klammern in verschachtelten Makros in dieser Menge vorzustellen, aber nicht geschweifte Klammern.
 
Bitte teilen Sie mit, ob dies das richtige Verhalten ist oder nicht, wenn die Reihenfolge der Initialisierung von Feldern einer Struktur/eines Klassenobjekts von der gegenseitigen Anordnung der Felder und nicht von den Einträgen nach dem Konstruktor abhängt?
struct A
{
  int Count;
  
  A() : Count(0) {}
};

struct B : public A
{
  int i, j; // Единственная строка, отличающая от C.

  B() : i(this.Count++), j(this.Count++) {}
};

struct C : public A
{
  int j, i; // Единственная строка, отличающая от B.

  C() : i(this.Count++), j(this.Count++) {}
};

void OnStart()
{
  B b;  
  Print(b.i); // 0
  Print(b.j); // 1

  C c;
  Print(c.i); // 1
  Print(c.j); // 0
}

Die Erwartung war, dass die Initialisierung von links nach rechts erfolgt, wie im Konstruktor angegeben.

C() : i(this.Count++), j(this.Count++) {}

Es stellte sich jedoch heraus, dass die Initialisierung von oben nach unten durch Felder erfolgt. Und die angegebene Reihenfolge der Initialisierung nach dem Konstruktor ist nicht wichtig. Ist dies richtig?

 
fxsaber #:
Bitte teilen Sie mir mit, ob dies das korrekte Verhalten ist, bei dem die Reihenfolge der Initialisierung von Feldern einer Struktur/eines Klassenobjekts von der gegenseitigen Anordnung der Felder und nicht von den Einträgen nach dem Konstruktor abhängt?

Die Erwartung war, dass die Initialisierung von links nach rechts erfolgt, wie im Konstruktor angegeben.

Es stellte sich jedoch heraus, dass die Initialisierung von oben nach unten nach Feldern erfolgt. Und die angegebene Reihenfolge der Initialisierung nach dem Konstruktor ist nicht wichtig. Ist dies richtig?

Warum schreiben die Entwickler eine so ausführliche Hilfe, wenn sie sowieso niemand liest? Ich schlage vor, die Hilfe auf einen Satz zu vereinfachen: Frag im Forum - man wird dir helfen!

 
A100 #:

Warum schreiben die Entwickler eine so ausführliche Hilfe, wenn sie sowieso niemand liest? Ich schlage vor, die Hilfe auf einen Satz zu vereinfachen: Frag im Forum - man wird dir helfen!

Wenn das Schema, die Antwort auf eine Frage in der Hilfe zu finden, klar ist, werde ich seltener auf die Hilfe im Forum zurückgreifen.

 
fxsaber #:

Wenn ich das Schema verstehe, wie man die Antwort auf die Frage in der Hilfe findet, werde ich das Forum seltener benutzen.


Unter "Datentypen" -> "Strukturen und Klassen".

In der Initialisierungsliste können die Mitglieder in beliebiger Reihenfolge aufgeführt werden, aber alle Klassenmitglieder werden in der Reihenfolge ihrer Deklaration initialisiert.
 
Sergey Gridnev #:

Unter "Datentypen" -> "Strukturen und Klassen"

In der Initialisierungsliste können die Mitglieder in beliebiger Reihenfolge stehen, aber alle Klassenmitglieder werden in der Reihenfolge initialisiert, in der sie deklariert wurden.

Danke! Leider ist es nicht immer klar, wo und wie man nachschauen muss.

 
fxsaber #:

Ich danke Ihnen. Leider ist es nicht immer klar, wo und wie man suchen muss.

Ja, das ist es.
 

Ich habe eine sehr unangenehme Sache in der Indikatorarbeit gefunden (MT5 und MT4).
Ereignisse blockieren die Timerarbeit.
In Expert Advisor gibt es so etwas nicht.
Einmal mehr bin ich überzeugt, dass es keinen Sinn macht, Indikatoren zu verwenden, bei denen eine stabile Timerarbeit erforderlich ist. Dies gilt insbesondere für reaktionsschnelle Schnittstellen.

Hier ist ein Indikator, der dieses Problem demonstriert, bei dem der Timer auf 20 Millisekunden eingestellt ist und die Zeit zwischen den Timer-Ereignissen angezeigt wird, wenn sie 100 Millisekunden überschreitet.

#property indicator_chart_window
//+------------------------------------------------------------------+
int OnInit()
  {
   EventSetMillisecondTimer(20);
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const int begin,
                const double &price[])
  {
   return(rates_total);
  }
//+------------------------------------------------------------------+
void  OnTimer()
  {
   static uint last_time = GetTickCount();
   uint cur_time = GetTickCount();
   if (cur_time-last_time>100) Print(string(cur_time-last_time)+" ms");
   last_time = cur_time;
  }
//+------------------------------------------------------------------+



 
Hinzugefügt.
template <typename T>
class A
{
public:  
  void f() const { ::Print(typename(T)); }
};

void OnStart()
{
  const A<MqlTick> a;
  
  a.f(); // struct MqlTick
}