Caratteristiche del linguaggio mql5, sottigliezze e tecniche - pagina 227

 
fxsaber #:
Si tratta di un risultato interessante.

È strano che non sia ancora stato risolto:

Forum sul trading, sui sistemi di trading automatico e sulla verifica delle strategie di trading

Bug, bug, domande

A100, 2020.08.01 05:42

Errore durante l'esecuzione:
template<typename T>
void f( T ) { Print( __FUNCTION__); }
void OnStart()
{
        {
                f<ulong>( 1 );
        }
}

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

Atteso: OnStart::f<ulong>


 
fxsaber #:
Limitazione del compilatore.

Si tratta di un difetto evidente: credo che il compilatore dovrebbe già chiamare un'équipe medica per questo tipo di codice.

È ipoteticamente possibile immaginare parentesi in macro annidate in tale quantità, ma non parentesi graffe.
 
Si può sapere se questo è un comportamento corretto o meno, in cui la sequenza di inizializzazione dei campi di una struttura/classe dipende dalla disposizione reciproca dei campi e non dalle voci dopo il costruttore?
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
}

L'aspettativa era di inizializzare da sinistra a destra, come specificato nel costruttore.

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

Ma si è scoperto che l'inizializzazione va dall'alto verso il basso per campi. E la sequenza di inizializzazione specificata dopo il costruttore non è importante. È corretto?

 
fxsaber #:
Si prega di indicare se questo è il comportamento corretto o meno, in cui la sequenza di inizializzazione dei campi di una struttura/classe dipende dalla disposizione reciproca dei campi e non dalle voci dopo il costruttore?

L'aspettativa era di inizializzare da sinistra a destra come specificato nel costruttore.

Ma si è scoperto che l'inizializzazione va dall'alto verso il basso per campi. E la sequenza di inizializzazione specificata dopo il costruttore non è importante. È corretto?

Perché gli sviluppatori scrivono una guida così dettagliata se poi nessuno la legge? Suggerisco di semplificare la guida a una frase: Chiedete al forum - vi aiuteranno!

 
A100 #:

Perché gli Sviluppatori scrivono una guida così dettagliata se poi nessuno la legge!!!? Propongo di semplificare la guida a una frase: Chiedete sul forum - vi aiuteranno!

Quando lo schema per trovare la risposta a una domanda nella guida sarà chiaro, ricorrerò meno spesso alla guida del forum.

 
fxsaber #:

Quando capirò lo schema per trovare la risposta alla domanda nella guida, userò meno spesso il forum.


In "Tipi di dati" -> "Strutture e classi".

Nell'elenco di inizializzazione, i membri possono essere inseriti in qualsiasi ordine, ma tutti i membri della classe saranno inizializzati secondo l'ordine della loro dichiarazione.
 
Sergey Gridnev #:

In "Tipi di dati" -> "Strutture e classi"

Nell'elenco di inizializzazione, i membri possono andare in qualsiasi ordine, ma tutti i membri della classe saranno inizializzati secondo l'ordine in cui sono stati dichiarati.

Grazie. Purtroppo non è sempre chiaro dove e come cercare.

 
fxsaber #:

Grazie. Purtroppo non è sempre chiaro dove e come cercare.

Sì, lo è.
 

Ho riscontrato una cosa molto spiacevole nel lavoro degli indicatori (MT5 e MT4).
Gli eventi bloccano il lavoro del timer.
Non esiste una cosa del genere in Expert Advisor.
Ancora una volta mi convinco che non ha senso utilizzare indicatori in cui è richiesto un lavoro stabile del timer. Questo è particolarmente vero per le interfacce reattive.

Ecco un indicatore che dimostra questo problema, in cui il timer è impostato su 20 millisecondi e il tempo tra gli eventi del timer viene visualizzato se supera i 100 millisecondi.

#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;
  }
//+------------------------------------------------------------------+



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

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