Erreurs, bugs, questions - page 2679

 
J'ai téléchargé une nouvelle version de MT5 (build 2365), malheureusement quelque chose est cassé,
Il semble que ce soit dans le passage des paramètres lors de l'appel du constructeur de la classe de base.
 
Sergey Dzyublik:
Bogue MT5 (build 2365) Erreur de compilation sur l'appel implicite du constructeur à la classe utilisant l'opérateur d'affectation, lorsque le pointeur passant par référence est utilisé comme argument du constructeur.
Si le passage de pointeur par référence est remplacé par le passage de valeur, tout fonctionne.

Merci pour le post, corrigé

 

Bug MT5 (build 2365) erreur de compilation lors de l'appel du constructeur de la classe de base lorsque le paramètre de la classe de modèle est utilisé comme classe de base.
Aucun problème dans MT5 (build 2363).

class B;

template<typename T>
class A : public T{
public:
   A() : T(){}   // 'B' - identifier expected
};


class B{};

void OnStart(){
   A<B> a;
};
 
Ilyas:
Nous pouvons voir que ArrayResize pour les objets est plus rapide maintenant.
Une fois de plus, la complexité d'une partie de la fonction ArrayResize a été réduite d'un logarithme à zéro

Merci beaucoup d'avoir accéléré ArrayResize pour la mémoire réservée.
MT5 (build 2365) sur un projet réel std::vector::push_back est 1,5 fois plus rapide que la build précédente.
Et le délai de std::vector:resize est passé de 2,2 fois à 1,45 fois.

 

build 2366, je pense que les constantes ne fonctionnent pas correctement maintenant

class A
{
private:
   int               f1(){Print(__FUNCTION__); return(1);}
   int               f2(){Print(__FUNCTION__); return(2);}
public:
   int               func(int v){const int a = f1(); const int b = f2(); return(a+b+v);}
};

A a1,a2;
//+------------------------------------------------------------------+
void OnStart()
{
   Print("1. ",a1.func(1));
   Print("2. ",a1.func(2));
   Print("3. ",a2.func(3));
   Print("4. ",a2.func(4));
}
//+------------------------------------------------------------------+

2020.03.21 12:55:59.904 tst (EURUSD,H1) A::f1

2020.03.21 12:55:59.904 tst (EURUSD,H1) A::f2

2020.03.21 12:55:59.904 tst (EURUSD,H1) 1. 4

2020.03.21 12:55:59.904 tst (EURUSD,H1) A::f1

2020.03.21 12:55:59.904 tst (EURUSD,H1) A::f2

2020.03.21 12:55:59.904 tst (EURUSD,H1) 2. 5

2020.03.21 12:55:59.904 tst (EURUSD,H1) A::f1

2020.03.21 12:55:59.904 tst (EURUSD,H1) A::f2

2020.03.21 12:55:59.904 tst (EURUSD,H1) 3. 6

2020.03.21 12:55:59.904 tst (EURUSD,H1) A::f1

2020.03.21 12:55:59.904 tst (EURUSD,H1) A::f2

2020.03.21 12:55:59.904 tst (EURUSD,H1) 4. 7

si vous remplacez const par static , cela fonctionnera comme prévu - un appel à f1() et f2() pendant l'initialisation de a et b

  int               func(int v){static int a = f1(); static int b = f2(); return(a+b+v);}

2020.03.21 12:58:03.496 tst (EURUSD,H1) A::f1

2020.03.21 12:58:03.496 tst (EURUSD,H1) A::f2

2020.03.21 12:58:03.496 tst (EURUSD,H1) 1. 4

2020.03.21 12:58:03.496 tst (EURUSD,H1) 2. 5

2020.03.21 12:58:03.496 tst (EURUSD,H1) 3. 6

2020.03.21 12:58:03.496 tst (EURUSD,H1) 4. 7

 

Si vous écrivez du code comme ça, c'est un bug total qui ne peut pas être attrapé.

class A
{
private:
   int               f1()const {static int v1=1; Print(__FUNCTION__); return(v1++);}
   int               f2()const {static int v2=1; Print(__FUNCTION__); return(v2++);}
public:
   int               func(int v){const int a = f1(); const int b = f2(); return(a+b+v);}
};
 
Igor Makanu:

build 2366, je pense que les constantes ne fonctionnent pas correctement maintenant

2020.03.21 12:55:59.904 tst (EURUSD,H1) A::f1

2020.03.21 12:55:59.904 tst (EURUSD,H1) A::f2

2020.03.21 12:55:59.904 tst (EURUSD,H1) 1. 4

2020.03.21 12:55:59.904 tst (EURUSD,H1) A::f1

2020.03.21 12:55:59.904 tst (EURUSD,H1) A::f2

2020.03.21 12:55:59.904 tst (EURUSD,H1) 2. 5

2020.03.21 12:55:59.904 tst (EURUSD,H1) A::f1

2020.03.21 12:55:59.904 tst (EURUSD,H1) A::f2

2020.03.21 12:55:59.904 tst (EURUSD,H1) 3. 6

2020.03.21 12:55:59.904 tst (EURUSD,H1) A::f1

2020.03.21 12:55:59.904 tst (EURUSD,H1) A::f2

2020.03.21 12:55:59.904 tst (EURUSD,H1) 4. 7

si vous remplacez const par static , cela fonctionnera comme prévu - un appel à f1() et f2() pendant l'initialisation de a et b

2020.03.21 12:58:03.496 tst (EURUSD,H1) A::f1

2020.03.21 12:58:03.496 tst (EURUSD,H1) A::f2

2020.03.21 12:58:03.496 tst (EURUSD,H1) 1. 4

2020.03.21 12:58:03.496 tst (EURUSD,H1) 2. 5

2020.03.21 12:58:03.496 tst (EURUSD,H1) 3. 6

2020.03.21 12:58:03.496 tst (EURUSD,H1) 4. 7

C'est exactement comme ça que ça devrait fonctionner.

 
Igor Makanu:

Si tu écris du code comme ça, c'est un bug totalement indétectable.

Tout est correct ici aussi.

 
Koldun Zloy:

C'est exactement comme ça que ça devrait fonctionner.

L'année dernière, cela n'a pas fonctionné de cette façon - j'ai spécialement testé les modificateurs de const.

et il semble que@Ilyas a expliqué comment exécuter un programme MQL, d'abord tous les const et static sont initialisés, peu importe où ils sont décrits, et ensuite les constructeurs de classe sont appelés

ok, avec cette initialisation static / const - il peut encore être distribué correctement, mais le fait que le modificateur const ne garantit pas que le compilateur va vérifier cela est très inattendu - mon deuxième exemple

 
Koldun Zloy:

Tout va bien ici aussi.

pas correct !

Je l'ai vérifié spécifiquement dans VS2019 :

class A
    {
        private int f1() { return 1; }
        private int f2() { return 2; }
        public int  f(int v) { const int a = f1(); const int b = f2(); return (v + a + b); }
    }

Erreur CS0133 L'expression assignée à "a" doit être constante. ConsoleApp2 ..\repos\ConsoleApp2\ConsoleApp2\Program.cs 13 Actif

Erreur CS0133 L'expression assignée à "b" doit être constante. ConsoleApp2 ..\repos\ConsoleApp2\ConsoleApp2\Program.cs 13 Actif