Erreurs, bugs, questions - page 2670

 

Une autre rencontre avec le bogue décrit précédemment- "Comportement indéfini, vous créez un objet enveloppé complexe avec le type interne "C" plusieurs fois, mais il s'avère être un type de données complètement différent, peut-être "B", peut-être "int", ce que vous voulez...".
En fait, il a fallu une journée pour localiser, reproduire et trouver des solutions de rechange, malheureusement en vain...
Lasolution de contournement suggérée précédemment en utilisant un paramètre de modèle fictif, pour l'exemple ci-dessous, s'est avérée inutile.

template<typename _Tp, typename _Opt>
struct It_g{
   class Opt : public _Opt{}; 
   _Tp p;
};

template<typename _Tp>
class A_g{
public:
   struct It : public It_g<_Tp, Opt_g<_Tp>>{};
};

template<typename _Tp>
class V{
public:
   struct It : public  A_g<_Tp>::It{};
   It b;
};

template<typename _Tp>
class Opt_g{
   template<typename _It>
   static void test(_It &it){      
      printf(typename(_Tp));          // int
      printf(typename(it.p));         // ClassA*
      
      _Tp p = it.p;                   // Compiler Error: '=' - illegal operation use
   };
};


template<typename T>
class GetStructType{
public:
   struct type : public T{};
};

template<typename _It>
void test(_It &it){
   GetStructType<_It>::type::Opt::test(it);
}

class ClassA{};


void OnStart(){ 
   V<int> v1;
   test(v1.b);
   
   V<ClassA*> v2;
   test(v2.b);
   
   V<int>::It it3;
   test(it3);
   
   V<ClassA*>::It it4;
   test(it4);
}

La seule solution viable que j'ai réussi à obtenir en utilisant le type d'auto "fait maison", mais j'ai obtenu des coûts de compilation énormes avec un bénéfice nul dans la vitesse du code réel...
Aidez-moi, quelqu'un a peut-être une idée pour contourner ce problème.

 
Alexey Klenov:

Erreur du testeur (ou peut-être que je ne comprends plus rien)

Le visualiseur, pour des raisons architecturales, ne montre pas toujours l'état actuel.

 
fxsaber:

Le visualiseur, pour des raisons architecturales, ne montre pas toujours l'état réel.

Merci, je vais garder cela à l'esprit.
 

Défauts dans la fonction template/class cache :
(non corrigé par MT5(build 2361)) *** (up) Comportement indéfini, vous créez un objet complexe enveloppé avec le type interne "C" plusieurs fois et il s'avère être un type de données complètement différent, peut-être "B", peut-être "int", ce que vous voulez...
(non corrigé par MT5(build 2361)) * Erreur de compilation, bug sur le passage d'un pointeur de fonction comme argument de modèle const ref.
(non corrigé par MT5(build 2361)) * Erreur de compilation, l'objet B<int> peut être créé après l'objet de la classe B<void*>, mais une erreur de compilation se produit si cela est fait avant.


Défauts dans le travail des fonctions/classes de modèles :
(non corrigé par MT5(build 2361)) *** (up) Erreur de compilation, bug à l'intérieur d'une fonction template, un pointeur passé dans uneconversion de type explicite se comporte comme une classe dans les autres cas comme un pointeur.
(non corrigé par MT5(build 2361)) ** Erreur de compilation, bogue avec la génération du code de la classe modèle lors de l'utilisation de la classe interne.
(non corrigé dans MT5(build 2361)) ** Erreur de compilation, bogue lors de la tentative d'accès à une classe interne pour un paramètre de modèle de fonction de modèle.
(non corrigé par MT5(build 2361)) ** Erreur de compilation, bogue lors de la génération d'une méthode/classe modèle, le processus de "remplacement automatique" du paramètre modèle sort du cadre du code du programme principal.
(non corrigé par MT5(build 2361)) * Erreur de compilation, bogue avec la génération de code de classe de modèle manquant lorsque la classe de modèle agit comme valeur de retour pour la méthode de modèle.
(non corrigé par MT5(build 2361)) * Erreur de compilation, bug lorsque la structure interne est passée à la fonction de modèle, letype de données résultant ne peut pas être utilisé comme un type de données de base pour une autre structure interne dans la classe de modèle.
(non corrigé par MT5(build 2361)) * Erreur de compilation, bogue sur l'appel d'une fonction modèle avec des types d'arguments explicites lorsqu'elle est appelée depuis une fonction non modèle surchargée.

(non corrigé par MT5 (build 2361)) Erreur de compilation, bogue sur la définition de la classe interne - pas de référence à l'espace de noms global lors de la spécification d'une classe de base.
(non corrigé
par MT5(build 2361)) *** (nouveau) Erreur de compilation, réclamation principale à l'avertissement de sortie inappropriée - "comportement déprécié, l'appel de méthode caché sera désactivé dans une future version du compilateur MQL".L'implémentation actuelle tire un canon sur un moineau.
(
non corrigé par MT5(build 2361)) ** (nouveau) Erreur de compilation, le bogue concerne la valeur de retour d'une fonction template lorsque la valeur de retour est une classe interne à l'intérieur d'une classe template dont le type de paramètre est défini par le type d'argument de la fonction template.
(
non corrigé par MT5(build 2361))*(nouveau)Erreur de compilation, la vérification des noms de types de modèles réutilisés n'est pas effectuée lors de la déclaration d'une fonction de modèle à l'intérieur d'une classe de modèle, ce qui entraîne un comportement inattendu.
(
non corrigé par MT5(build 2361)) * (nouveau) Runtimer Erreur, dans le constructeur de la classe de base, il est impossible d'effectuer un typecast explicite lors du casting du pointeur vers l'objet de la classe de base vers le pointeur vers la classe parent.
(
non corrigé par MT5(build 2361)) (nouveau) Erreur de compilation, défauts multiples liés au retour de l'objet "in place created" lorsque la classe/structure du modèle est l'objet.


Défauts liés au décalage de la priorité d'appel pour les fonctions surchargées dans MQL par rapport à C++ :
(non corrigé par MT5(build 2361)) *** Lorsqu'il y a héritage de classes A <= B <= C <= D et que deux fonctions de surcharge sont implémentées, par exemple, l'une avec le paramètre A* et la seconde avec le paramètre B*, alors passer dans une telle fonction un objet C* ou D* dans MQL provoque une erreur de compilation "ambiguous call to overloaded function".
(non corrigé par MT5(build 2361)) ** Runtime, incompatibilité de priorité pour les appels de fonctions de modèle surchargées.
(non corrigé par MT5(build 2361)) ** Erreur de compilation, la priorité des appels de fonctions template surchargées dépend en fait du type de paramètre template, ce qui en théorie ne devrait pas affecter le résultat de la compilation.
(non corrigé par MT5(build 2361)) ** Bien qu'il existe une fonction modèle surchargée avec une signature appropriée pour les paramètres passés, une erreur de compilation se produit lors de la génération du code de la fonction modèle.


Défauts liés à la lenteur de l'exécution des fonctions, au travail de l'optimiseur de code :
(non corrigé par MT5(build 2361)) ** (nouveau) Temps d'exécution, surcharge importante lors de l'ajout d'un élément à la fois dans un tableau à l'aide de ArrayResize, malgré le fait que la mémoire pour ceux-ci ait été réservée à l'avance, par exemple, les structures sont jusqu'à 7 fois plus lentes.


Suggestions :
link- sur l'autorisation de passer des littéraux et des variables temporaires comme arguments de fonction const ref.
lien- lors dudéplacement des fichiers du projet dans l'onglet "Projet", pour les fichiers déplacés qui sont ouverts et se trouvent dans les onglets ME, pour mettre à jour automatiquement leur chemin d'accès.
link- pour introduire la fonctionnalité de déclaration de typedef dans MQL.
lien- à propos de la possibilité de forcer la génération de constructeurs de copie et d'opérateurs d'affectation par défaut.

 
fxsaber:

Pour des raisons architecturales, le visualiseur ne montre pas toujours l'état actuel.

Alexey Klenov:
Merci, je le garde à l'esprit.

Remédié en exécutant quelques ticks (F12) après avoir fait une pause.

 
Andrey Khatimlianskii:

Remédié en exécutant quelques ticks (F12) après avoir fait une pause.

Merci. Je vais essayer.

 
Sergey Dzyublik:

Une autre rencontre avec le bogue décrit précédemment- "Comportement indéfini, vous créez un objet enveloppé complexe avec le type interne "C" plusieurs fois, mais il s'avère être un type de données complètement différent, peut-être "B", peut-être "int", ce que vous voulez...".
En fait, il a fallu une journée pour localiser, reproduire et trouver des solutions de rechange, malheureusement en vain...

J'ai finalement réussi à trouver une solution acceptable.
Il s'avère que l'utilisation d'un membre de classe statique permet de contourner le bogue décrit ci-dessus :

template<typename _Tp, typename _Opt>
struct It_g{
   class Opt : public _Opt{}; 
   _Tp p;
   
   static Opt opt;
};

template<typename _Tp, typename _Opt>
static It_g::Opt It_g::opt;


template<typename _Tp>
class A_g{
public:
   struct It : public It_g<_Tp, Opt_g<_Tp>>{};
};

template<typename _Tp>
class V{
public:
   struct It : public  A_g<_Tp>::It{};
   It b;
};


template<typename _Tp>
class Opt_g{
   template<typename _It>
   static void test(_It &it){      
      printf(typename(_Tp));          // ClassA*
      printf(typename(it.p));         // ClassA*
      
      _Tp p = it.p;                   // OK
   };
};


template<typename _It>
void test(_It &it){
   it.opt.test(it);
}

class ClassA{};


void OnStart(){ 
   V<int> v1;
   test(v1.b);
   
   V<ClassA*> v2;
   test(v2.b);
   
   V<int>::It it3;
   test(it3);
   
   V<ClassA*>::It it4;
   test(it4);
}
 

Comment réparer cette erreur de stockage ?


Progressivement, il refuse d'enregistrer de plus en plus de fichiers. Bientôt, tout ce qui sera stocké sera impossible à mettre à jour.

 

Les profits/pertes dans l'infobulle pour les ordres d'achat et de vente à cours limité sont calculés de manière incorrecte.

Lorsque vous passez la souris sur tp

lorsque l'on passe la souris sur le sl

 

Les gars, j'ai pris un job en freelance. Un client m'a envoyé le fichier à la dernière minute. On dirait qu'il a été décompilé. Je veux d'abord m'assurer que c'est vrai avant de me plaindre. Je joins un morceau de code.

int f0_0(string As_0, int &Ai_8, int &Aia_12[]) {
   string Ls_16;
   if (StringLen(As_0) == 0) return (-1);
   string Ls_24 = As_0;
   int Li_32 = 0;
   Ai_8 = 0;
   ArrayResize(Aia_12, Ai_8);
   while (StringLen(Ls_24) > 0) {
      Li_32 = StringFind(Ls_24, ",");
      if (Li_32 > 0) {
         Ls_16 = StringSubstr(Ls_24, 0, Li_32);
         Ls_24 = StringSubstr(Ls_24, Li_32 + 1, StringLen(Ls_24));
      } else {
         if (StringLen(Ls_24) > 0) {
            Ls_16 = Ls_24;
            Ls_24 = "";
         }
      }
      if (f0_2(Ls_16, Ai_8, Aia_12) == 0) return (-2);
   }
   return (1);
}

Une des fonctions. Toutes les variables et fonctions ressemblent à ceci.