Erreurs, bugs, questions - page 2682

 

J'ai rencontré un drôle de problème. Il est impossible de passer un type template avec plusieurs types-paramètres dans une macro, car le préprocesseur ne sait pas qu'il a affaire à un template et considère les paramètres par des virgules.

J'ai trouvé la description du problème et sa solution pour C++ dans l'OS.

#define  COMMA ,
#define  XYZ(type) {type ptr;}

XYZ(TemplatedType<A COMMA B>); // ошибка

Je l'ai essayé dans MQL, mais malheureusement cela n'a pas fonctionné. Le compilateur donne une erreur "undeclared identifier" pour une variable décrite par le type passé.

Je me suis débrouillé avec une classe dérivée supplémentaire pour l'instant, mais puis-je le résoudre en C++ ?

Oups. J'ai trouvé une solution. Voici comment cela fonctionne :

#define  COMMA() ,
La question est supprimée.
Passing a template type into a macro
Passing a template type into a macro
  • 2017.05.30
  • bitmaskbitmask 22.3k1111 gold badges7070 silver badges133133 bronze badges
  • stackoverflow.com
I have a macro that takes a number of arguments, one of which is a type. For instance: If I try to instantiate this with a template type, say: This will not work as intended, as the pre-processor knows nothing of templates. It will...
 

Bug MT5 (build 2367) : l'emplacement des fonctions surchargées des modèles affecte le résultat de la compilation.
Le ticket original sous lequel les travaux ont été effectués -https://www.mql5.com/ru/forum/1111/page2655#comment_15119627
C++ en ligne(https://onlinegdb.com/BJzbH2DLL).


class input_iterator_tag  {};
class forward_iterator_tag       : public input_iterator_tag         {};
class bidirectional_iterator_tag : public forward_iterator_tag       {};
class random_access_iterator_tag : public bidirectional_iterator_tag {};


template<typename _Iterator, typename _Tp>
_Iterator set_value(const _Iterator &it,  _Tp &value, const  forward_iterator_tag*  tag){
   printf("2\r\n");
   return set_value(it, value, (input_iterator_tag*)NULL);                // 'set_value' - ambiguous call to overloaded function        
};

template<typename _Iterator, typename _Tp>
_Iterator set_value(const _Iterator &it,  _Tp &value, const  bidirectional_iterator_tag*  tag){
   printf("3\r\n");
   return set_value(it, value, (forward_iterator_tag*)NULL);
};

template<typename _Iterator, typename _Tp>
_Iterator set_value(const _Iterator &it,  _Tp &value, const random_access_iterator_tag* tag){
   printf("4\r\n");
   return set_value(it, value, (bidirectional_iterator_tag*)NULL);
};

template<typename _Iterator, typename _Tp>
_Iterator set_value(const _Iterator &val,  _Tp &value, const input_iterator_tag* tag){
   printf("1\r\n");
   return val;
};


template<typename _Iterator, typename _Tp>
_Iterator set_value(const _Iterator &it, _Tp &value){
   return set_value(it, value, it.tag);                        
};


template<typename T>
struct A{
   T data;
   static random_access_iterator_tag* tag;
};

template<typename T>
random_access_iterator_tag* A::tag = NULL;

class B{};


void OnStart (){ 
   A<B*> it;
   const B* const b_ptr = new B();
   set_value(it, b_ptr);                                      
   
   A<int> it_int;
   const int value_int = 5;
   set_value(it, value_int);         
}

int main(){
   OnStart();
   return 0;
};
 

Défauts dans le fonctionnement de la fonction template/class cache :
(corrigé par MT5(build 2368)) ***(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...
(corrigé par MT5(build 2368)) * Erreur de compilation, bug sur le passage d'un pointeur de fonction comme argument de modèle const ref.
(corrigé par MT5(build 2368)) * Erreur de compilation, l'objet B<int> peut être créé après l'objet B<void*>, mais une erreur de compilation se produit si cela est fait avant.


Défauts dans la fonction de modèle/travail de classe :
(corrigé par MT5(build 2368)) ***(up) Erreur de compilation, bogue à l'intérieur d'une fonction template, un pointeur passé dans uneconversion de type explicite se comporte comme une classe autrement.
(corrigé par MT5(build 2368)) **(up) Erreur de compilation, bug sur la tentative d'accès à la classe interne pour un paramètre de modèle d'une fonction de modèle.
(non corrigé par MT5(build 2368)) *** Erreur de compilation, la principale plainte est un avertissement de sortie inapproprié - "comportement déprécié, l'appel de méthode caché sera désactivé dans une future version du compilateur MQL". L'implémentation actuelle fait d'une pierre deux coups.
(non corrigé par MT5(build 2368)) ** Compile Error, 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 2368)) ** Erreur de compilation, bug d'espace de nom et de portée dans le constructeur de modèle lors de l'appel d'une classe de base lorsque le même nom de classe est utilisé dans l'héritage et dans la classe interne.
(non corrigé par MT5(build 2368)) * 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 2368)) 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 définition d'une classe de base.
(corrigé par MT5(build 2368)) ** Erreur de compilation, bogue avec la génération du code de la classe modèle lors de l'utilisation de la classe interne.
(corrigé par MT5(build 2368)) ** Erreur de compilation, bug sur la génération de méthodes/classes de modèles, le processus de substitution automatique des paramètres de modèles sort du scop pour entrer dans le code du programme principal.
(corrigé par MT5(build 2368)) * Erreur de compilation, bogue lié au fait que le code de la classe du modèle n'est pas généré automatiquement lorsque la classe du modèle sert de valeur de retour pour la méthode du modèle.
(corrigé par MT5(build 2368)) * Erreur de compilation, bug lors du passage d'une structure interne à une fonction de modèle, letype de données résultant ne peut pas être utilisé comme type de données de base pour une autre structure interne dans la classe de modèle.
(corrigé par MT5(build 2368)) * 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.
(corrigé par MT5(build 2368)) Erreur de compilation, défauts multiples liés au retour de l'objet "in place created" lorsque l'objet est une classe/structure modèle.
(non corrigé par MT5(build 2368)) *( Ce n'est pas un bug, c'est une fonctionnalité) dans le constructeur de la classe de base, il est impossible d'effectuer un typecast explicite lors de la conversion du pointeur vers l'objet de la classe de base en pointeur vers la classe parent.


Défauts liés à l'incohérence des priorités des appels de fonctions surchargées dans MQL par rapport à C++ :
(corrigé par MT5(build 2368)) **(up) Erreur de compilation, la priorité d'appel des fonctions template surchargées dépend en fait du type de paramètre template, ce qui théoriquement n'affecte pas le résultat de la compilation.
(corrigé par MT5(build 2368)) **(up) Erreur de compilation lorsque la première fonction template surchargée utilise une classe de base template entièrement spécialisée et la seconde une classe de base template non spécialisée.
(non corrigé par MT5(build 2368)) ** Erreur de compilation, une erreur de compilation se produit lors de la génération du code d'une fonction modèle, malgré le fait qu'il existe une fonction modèle surchargée avec une signature appropriée pour les paramètres passés.
(non corrigé par MT5(build 2368)) * Erreur de compilation, "appel ambigu à une fonction surchargée" lorsque des fonctions de modèle surchargées avec un nombre différent de paramètres de modèle sont appelées.
(corrigé par MT5(build 2368)) *** Erreur de compilation lorsque l'on hérite des classes A <= B <= C <= D et que l'on implémente deux fonctions de surcharge, par exemple, une avec le paramètre A* et la seconde avec le paramètre B*, puis que l'on passe un objet C* ou D* dans une telle fonction dans MQL provoque une erreur de compilation "appel ambigu à une fonction surchargée".
(corrigé par MT5(build 2368)) ** Runtime, incompatibilité de priorité pour les appels de fonctions de modèle surchargées.

Défauts liés à la lenteur d'exécution des fonctions, aux performances de l'optimiseur de code :
(corrigé par MT5(build 2368)) ** Temps d'exécution, surcharge importante lors de l'ajout d'un élément à la fois dans un tableau en utilisant ArrayResize, malgré le fait que la mémoire pour eux a été réservée, par exemple, les structures sont jusqu'à 7 fois plus lentes.


Suggestions :
(nouveau) lien - sur l'implémentation de la prise en charge d'intellisense pour la fonctionnalité des espaces de noms basée sur le travail d'intellisense pour les méthodes statiques dans les classes.
link- pour permettre aux littéraux et aux variables temporaires d'être passés comme arguments de fonction const ref.
lien- lors dudéplacement de fichiers de projet dans l'onglet Projet, pour les fichiers déplacés qui sont ouverts et dans les onglets ME, pour mettre automatiquement à jour leur chemin d'accès.
link- pour introduire la fonctionnalité de déclaration de typedef dans MQL.
lien- sur la possibilité de forcer la génération de constructeurs de copie et d'opérateurs d'affectation par défaut.

 
Bug MT5 (build 2368) erreur de compilation lors de l'utilisation du modificateur d'accès par défaut lors de l'héritage dans une classe template, lorsque le paramètre template agit comme classe de base.
Tout fonctionnait avant, apparemment quelque chose s'est brisé dans le cadre de la correction d'autres bogues.

class A{};

template<typename T>
class B : T{};            //'A' - unexpected token      

template<typename T>
class BB : private T{};

   
void OnStart(){    
   BB<A> bb;      // Ok
   B<A> b;        // Compile Error: 
}
 

Bug MT5 (build 2368) erreur de compilation lors de l'appel d'une instruction d'affectation via l'indication explicite de la classe de base. Le problème se produit pourune classe modèle avec un paramètre modèle comme classe de base.
Cela fonctionnait avant, apparemment quelque chose s'est brisé dans le cadre de la correction d'autres bugs.

struct A{
   uchar data;
   void operator=(int n){
      printf("1");
   }
};

template<typename T>
struct B : public T{
   void operator=(int n){
      T::operator=(n);    //'operator' - undeclared identifier  
   }
};

   
void OnStart(){    
   B<A> b;        
   b = 0;
}
 
Est-ce que la mise à jour MT5 du 08.03.2020 de tout le monde a commencé à avoir un historique de transactions qui saute ?
Dossiers :
 

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

Bugs, bugs, questions

fxsaber, 2020.03.22 10:04

mq5 est ok. mq4 est cassé. Vous pouvez prendre TypeToBytes_ExampleScript.mq4 d'ici. Il ne compile que si vous changez l'extension en mq5.

2368 - rien n'a changé.

 

Grâce à un seul terminal MT5, je pouvais toujours me connecter à n'importe quel compte de courtier. En cas de problème lors de la première connexion, j'ai simplement utilisé les outils du terminal pour rechercher le courtier approprié, en obtenant automatiquement les données de ses serveurs de trading. Après cela, j'ai pu me connecter sans problème.


Aujourd'hui, j'ai été confronté pour la première fois à une situation (nouveau courtier), à laquelle rien n'aide. Je ne peux pas me connecter. Dans les écritures de journal.

2020.03.25 09:50:33.538  'xxx': no connection to XXX-Server


J'ai téléchargé le terminal natif du courtier - il se connecte immédiatement. Mon terminal de recherche - pas question. Pour la première fois, un tel.

Pouvez-vous me dire comment faire pour qu'un terminal non natif puisse se connecter au compte de trading ?

 
fxsaber:

Pouvez-vous me dire comment faire pour qu'un terminal non natif puisse se connecter à un compte de trading ?

Dans mt4, j'ai dû copier le fichier server.ini dans un autre terminal, afin de ne pas avoir à rechercher des serveurs de commerce.

ne sait pas dans mt5

 
fxsaber:

Grâce à un seul terminal MT5, je pouvais toujours me connecter à n'importe quel compte de courtier. En cas de problème lors de la première connexion, j'ai simplement utilisé les outils du terminal pour rechercher le courtier approprié, en obtenant automatiquement les données de ses serveurs de trading. Après cela, j'ai pu me connecter sans problème.


Aujourd'hui, j'ai été confronté pour la première fois à une situation (nouveau courtier), à laquelle rien n'aide. Je ne peux pas me connecter. Dans les écritures de journal.


J'ai téléchargé le terminal natif du courtier - il se connecte immédiatement. Mon terminal de recherche - pas question. Pour la première fois, un tel.

Pouvez-vous me dire comment télécharger mon terminal sans utiliser le terminal natif du courtier ?

Je pensais que j'avais une sorte de bug... Je n'ai pas pu me connecter à Admiralmarkets-Demo hier.