Caractéristiques du langage mql5, subtilités et techniques - page 227

 
fxsaber #:
C'est un résultat intéressant.

Il est étrange qu'il n'ait pas encore été corrigé :

Forum sur le trading, les systèmes de trading automatisés et les tests de stratégies de trading

Bugs, bugs, questions

A100, 2020.08.01 05:42

Erreur pendant l'exécution :
template<typename T>
void f( T ) { Print( __FUNCTION__); }
void OnStart()
{
        {
                f<ulong>( 1 );
        }
}

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

Attendu : OnStart::f<ulong>


 
fxsaber #:
Limitation du compilateur.

Il s'agit d'un défaut évident - je pense que le compilateur devrait déjà faire appel à une équipe médicale pour ce type de code

Il est hypothétiquement possible d'imaginer des parenthèses dans des macros imbriquées dans une telle quantité, mais pas des parenthèses frisées.
 
Veuillez nous indiquer s'il s'agit ou non d'un comportement correct, lorsque la séquence d'initialisation des champs d'un objet structure/classe dépend de l'arrangement mutuel des champs et non des entrées après le constructeur ?
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
}

On s'attendait à ce que l'initialisation se fasse de gauche à droite, comme spécifié dans le constructeur.

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

Mais il s'est avéré que l'initialisation se fait de haut en bas par champs. Et la séquence d'initialisation spécifiée après le constructeur n'est pas importante. Est-ce correct ?

 
fxsaber #:
Veuillez me dire si c'est le bon comportement ou non, où la séquence d'initialisation des champs d'un objet structure/classe dépend de l'arrangement mutuel des champs et non pas des entrées après le constructeur ?

On s'attendait à ce que l'initialisation se fasse de gauche à droite, comme spécifié dans le constructeur.

Mais il s'est avéré que l'initialisation se fait de haut en bas par champs. Et la séquence d'initialisation spécifiée après le constructeur n'est pas importante. Est-ce correct ?

Pourquoi les développeurs écrivent-ils une aide aussi détaillée si personne ne la lit de toute façon ? Je suggère de simplifier l'aide en une phrase : Demandez sur le forum - ils vous aideront !

 
A100 #:

Pourquoi les développeurs écrivent-ils une aide aussi détaillée si personne ne la lit de toute façon ? Je propose de simplifier l'aide en une phrase : Demandez sur le forum - ils vous aideront !

Lorsque le schéma de la réponse à une question dans l'aide sera clair, j'aurai moins souvent recours à l'aide du forum.

 
fxsaber #:

Lorsque j'aurai compris le principe de trouver la réponse à la question dans l'aide, j'utiliserai moins souvent le forum.


Dans "Types de données" -> "Structures et classes".

Dans la liste d'initialisation, les membres peuvent aller dans n'importe quel ordre, mais tous les membres de la classe seront initialisés selon l'ordre de leur déclaration.
 
Sergey Gridnev #:

Dans "Types de données" -> "Structures et classes", lire

Dans la liste d'initialisation, les membres peuvent être placés dans n'importe quel ordre, mais tous les membres de la classe seront initialisés dans l'ordre dans lequel ils sont déclarés.

Merci. Malheureusement, il n'est pas toujours évident de savoir où et comment chercher.

 
fxsaber #:

Je vous remercie. Malheureusement, il n'est pas toujours évident de savoir où et comment chercher.

Oui, c'est vrai.
 

J'ai trouvé une chose très désagréable dans le travail des indicateurs (MT5 et MT4).
Les événements bloquent le travail du timer.
Il n'y a rien de tel dans Expert Advisor.
Une fois de plus, je suis convaincu qu'il n'est pas judicieux d'utiliser des indicateurs lorsqu'un travail stable du timer est nécessaire. C'est particulièrement vrai pour les interfaces réactives.

Voici un indicateur qui illustre ce problème, où le minuteur est réglé sur 20 millisecondes et où le temps entre les événements du minuteur est affiché s'il dépasse 100 millisecondes.

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



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

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