Erreurs, bugs, questions - page 2472

 
Sergey Dzyublik:

J'ai été surpris de constater qu'il était possible de déclarer un typedef avec un pointeur vers une fonction template.
Cependant, le bonheur n'a pas duré longtemps.

C'est ce dont je parlais
 

Des dizaines de "fonctionnalités" et de bogues dans la MT ont été signalés récemment.
Comment savoir si cela vaut la peine d'attendre qu'ils soient réparés ou non ?
Ne suggérez pas de tout tester à chaque fois qu'une nouvelle version est publiée.

(non corrigé dans MT5(build 2057)) "Strategy Tester : 2 passes prévues, mais en pratique un nombre infini de passes > 900pc en raison de l'erreur "OnInit critical error"".
(non corrigé dans MT5(build 2057))"Valeur invalide du champ de taille du tableau dans l'opérateur d'affectation par défaut pour les structures avec tableaux dynamiques".
(non corrigé dans MT5(build 2057))"Le compilateur ne voit pas le constructeur de copie par défaut pour la classe lorsqu'il retourne un objet de classe par valeur à partir d'une fonction".
(non corrigé dans MT5(build 2057))"Bogue de compilation sur le type cast "in itself" pour les classes de motifs et les structures "complexes"".
(non corrigé dans MT5(build 2057))"Lors du travail avec typedef, l'utilisation d'une fonction template avec une spécialisation explicite ne génère pas de code pour cette fonction template".
(non corrigé dans MT5(build 2057))"Erreur de compilation lors de la réutilisation de la même signature de fonction dans un typedef".
#
(non corrigé dans MT5(build 2057))"Une grande partie des fonctions de chaîne de caractères ne fonctionne pas avec des caractères NULL dans une chaîne de caractères (par exemple : ShortArrayToString, StringInit, StringFill)".
(non corrigé dans MT5(build 2057))"La fonction StringSetLength ne fonctionne que pour "couper" la longueur de la chaîne, pas pour l'augmenter.
(corrigé dans MT5(build 2057))"Strategy Tester : 750 processus "metatester64.exe"sont en cours d'exécution".
#
"Forum www.mql5.com, lors de la modification d'un message avec une image, l'image précédente n'est pas remplacée par la nouvelle".


Suggestions :
"Autoriser l'utilisateur à forcer la génération/suppression de code pour l'opérateur d'affectation par défaut (constructeur de copie)".
"Permettre à ArrayCopy de copier des classes et des structures "complexes", de façon similaire à la façon dont les structures fournissent une fonctionnalité de copie profonde pour tout type d'objet".
# Fournir une fonctionnalité permettant à l'utilisateur de lire/définir la valeur decapacité lorsqu'il travaille avec des tableaux dynamiques.

"Changements pour améliorer les infographies du service Signaux"

 
A100:
C'est ce dont je parlais.

Letypage des modèles et l'utilisation du typage dans une classe modèle sont deux choses différentes.
La deuxième option fonctionne, mais il y a un problème de chevauchement d'espace de noms lors de la réutilisation d'une classe modèle avec un type différent.

 
Alexey Navoykov:

Je crée un symbole personnalisé et je le remplis avec des barres quotidiennes sur 25 ans, cela devrait peser environ 400 kb. Or, le dossier du symbole crée des fichiers .hcc d'une taille totale de 15 mb ! Et en plus, tout cela prend environ 20 secondes ! Hors de question... Comment expliquer cela ?

Jetez un coup d'œil à ce qui a été enregistré.

 
fxsaber:

Regardez ce qui est enregistré.

Eh bien, je ne connais pas le format hcc, donc je ne peux pas vérifier ce qu'il y a dans le fichier. Mais dans le terminal, il montre des barres quotidiennes. Quand je passe à une échelle de temps plus petite, je vois les mêmes barres. Apparemment, il enregistre aussi TOUTES les échelles de temps dans le fichier initialement, donc... Je pensais que seules les barres minutes étaient sauvegardées, à partir desquelles toutes les autres échéances sont ensuite synthétisées. Et le nombre de barres minutes, comme déjà dit, coïncide avec les barres du jour, c'est-à-dire qu'il y a environ 7000 barres minutes au total.

Par conséquent, j'ai l'idée qu'il enregistre 7000*M1, 7000*M2, 7000*M3, etc. jusqu'à 7000*D1 dans un fichier. Si c'est le cas, il récupérera probablement 15 Mo au total. Correction : environ 5 secondes(20 - lors de la mise à jour de l'historique existant).

 

Il y a un problème sur le site du forum : je ne peux pas voir mes derniers messages.
Par exemple,ceci et ceci sont absents de"Tous les messages".
Et il semble que l'évaluation était supérieure à 6000 il y a encore quelques mois. Je ne sais pas - peut-être que le classement peut diminuer au fil du temps en raison d'une activité moindre.

 
class A{
public:
   struct AA{
      uchar data[8];
   };
   static AA obj;
};

AA A::obj = {0};     // OK


template<typename T>
class B{
public:
   struct BB{
      T data[8];
   };
   static BB obj;
};

template<typename T>
BB B::obj = {0};       //'BB' - declaration without type    




void OnStart(){  
   ArrayPrint(A::obj.data);
   //ArrayPrint(BB<int>::obj.data);
}


Il n'est actuellement pas possible d'utiliser une variable statique déclarée à l'intérieur d'une classe modèle.
Avec l'introduction d'un espace de noms, cette restriction peut-elle être contournée ?

 
Sergey Dzyublik:


Actuellement, il n'est pas possible d'utiliser une variable statique déclarée dans une classe modèle.
Avec l'introduction des espaces de noms, cette restriction pourrait-elle être contournée ?

Il ne s'agit pas de la variable. Il ne peut pas voir la classe BB. Il doit être pris en dehors de la classe B comme template<typename T> classe BB;

 
Alexey Navoykov:

Il ne s'agit pas de la variable. Elle ne voit pas la classe BB, elle doit être déplacée en dehors de la classe B commetemplate<typename T>class BB ;

Le post s'adressait aux développeurs, qui s'apprêtaient à "tricher" avec le support dès la sortie de la boîte.

Encore une fois, le problème concerne l'impossibilité d'utiliser une variable statique déclarée dans une classe modèle.
Que suggérez-vous de faire en cas de typedef :

 
class A{
public:
   typedef void (*callback_A)();
   static callback_A f_ptr;

};
callback_A A::f_ptr = NULL;                  // Ok


template<typename T>
class B{
public:
   typedef T (*callback_B)();
   static callback_B f_ptr;
};
template<typename T>
callback_B B::f_ptr = NULL;                  //'callback_B' - declaration without type	

void func_A(){PRINT(__FUNCSIG__);}
int func_B(){PRINT(__FUNCSIG__); return 0;}

void OnStart(){  
   A::f_ptr = func_A;
   A::f_ptr();

   //B<int>::f_ptr = func_B;
   //B<int>::f_ptr();
}
 
Sergey Dzyublik:


Actuellement, il n'est pas possible d'utiliser une variable statique déclarée dans une classe modèle.
Avec l'introduction d'un espace de noms, cette restriction pourrait-elle être contournée ?

Oui, vous pouvez.

Le code sera légèrement différent, plus correct, voici un exemple :

//+------------------------------------------------------------------+
//|                                                  ScopeSample.mq5 |
//|                        Copyright 2019, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2019, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
template<typename T>
class A
  {
public:
   struct Item
     {
      T                 value;
      
      Item(T initial=10):value(initial) { Print(__FUNCSIG__); }
     };

   static Item       s_default;
  };
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
template<typename T>
class B
  {
public:
   struct Item
     {
      T                 value;
      
      Item(T initial=100):value(initial) { Print(__FUNCSIG__); }
     };

   static Item       s_default;
  };
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
template<typename T>
A::Item A::s_default;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
template<typename T>
B::Item B::s_default;
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   Print(A<int>::s_default.value);
   Print(B<int>::s_default.value);
  }
//+------------------------------------------------------------------+


Résultat :

2019.05.24 17:16:20.225 ScopeSample (EURUSD,H1) A<int>::Item::Item(int)
2019.05.24 17:16:20.225 ScopeSample (EURUSD,H1) B<int>::Item::Item(int)
2019.05.24 17:16:20.225 ScopeSample (EURUSD,H1) 10
2019.05.24 17:16:20.225 ScopeSample (EURUSD,H1) 100