Erreurs, bugs, questions - page 2361

 
Les commentaires non liés à ce sujet ont été déplacés vers "Questions des débutants de MQL4 MT4 MetaTrader 4".
 

Chers concepteurs du site web,

Voici une capture d'écran des messages, veuillez me dire quel interlocuteur est actuellement sélectionné


Mes yeux grimpent déjà sur mon front pour comprendre à qui j'écris ......

Veuillez attribuer un code de couleur à ceux à qui vous n'avez pas répondu, à ceux à qui vous avez répondu, ainsi qu'un code de couleur distinct pour la personne à qui vous envoyez un message ...

 
Vladimir Pastushak:

Chers concepteurs du site web,

Voici une capture d'écran des messages, veuillez me dire quel interlocuteur est actuellement sélectionné


Mes yeux grimpent déjà sur mon front pour comprendre à qui j'écris ......

Veuillez attribuer un code de couleur à ceux à qui je n'ai pas répondu, à ceux à qui j'ai répondu, et un code de couleur distinct pour la personne à qui je suis en train d'envoyer un message ...

2

Mais je suis d'accord. On ne le remarque pas toujours, il y a peu de contraste.

 
Vladimir Pastushak:

Voici une capture d'écran des messages, veuillez me dire quel interlocuteur est actuellement sélectionné

dans Chrome(71.0.3578.98) ok dans FF (64) pas visible du tout
 
En général, il serait bon d'ajouter du contraste dans tout le site
 

s'il est possible de déréférencer un pointeur *CObject dans MQL ?

J'ai essayé différentes variantes, voici un script de test, j'ajoute 3 éléments Myclass à la liste liée et ensuite je change les valeurs des champs CMyclass, ça marche :

#include <Object.mqh>
#include <Arrays\List.mqh>
//+------------------------------------------------------------------+
class CMyclass:public CObject
  {
public:
   int               x;
   double            y;
   void              CMyclass(void):x(-1),y(-2.2) { }
  };
//+------------------------------------------------------------------+
void OnStart()
  {
   CList *base=new CList;
   CMyclass *result;
   for(int i=0;i<3;i++)
     {
      base.Add(new CMyclass);
      result=base.GetCurrentNode();
      result.x = 99;
      result.y = -555.5;
     }
   for(int i=0;i<3;i++)
     {
      result=base.GetNodeAtIndex(i);
      Print(result.x," : ",result.y);
     }
   delete base;
  }
//+------------------------------------------------------------------+

Puis-je modifier les champs des éléments CMyclass créés dynamiquement, sans pointeur intermédiaireCMyclass *result ?

Comme ceci :(CMyclass *)(base.GetCurrentNode()).x = 99 ;

PS : Je pense que nous devons utiliser le typedef, mais jusqu'à présent sans succès.

 
Igor Makanu:

s'il est possible de déréférencer un pointeur *CObject dans MQL ?

J'ai essayé différentes variantes, voici un script de test, j'ajoute 3 éléments Myclass à la liste liée et ensuite je change les valeurs des champs CMyclass, ça marche :

Puis-je modifier les champs des éléments CMyclass créés dynamiquement, sans pointeur intermédiaireCMyclass *result ?

Comme ceci :(CMyclass *)(base.GetCurrentNode()).x = 99 ;

PS : Je pense qu'il faut utiliser le typedef, mais sans succès jusqu'à présent.

Je ne sais pas ce que fait la bibliothèque CList, mais j'avais l'habitude de faire ceci

#define  alive(node)  (CheckPointer(node)==POINTER_DYNAMIC)
#define  loopf(type, node)  for(type *o=alive(node)?node.First():NULL; alive(o); o=alive(o)?(alive(o.Next())?o.Next():NULL):NULL)
//.....
      loopf(COrder, corr){
         if((fabs(o.StopLoss()-sl)>=_point(o.Symbol())) || (fabs(o.TakeProfit()-tp)>=_point(o.Symbol()))){
            o.SLTP(sl, tp);
         }
      }
//.....
 
Ilya Malev:

Je ne sais pas ce que fait la bibliothèque CList, mais j'avais l'habitude de faire ceci

Merci, ce n'est pas ce que je recherche, votre exemple est en fait une conversion de type par appel de fonction.

SZZ : Je n'ai pas l'habitude de travailler avec des pointeurs dans MQL, j'essaie de le comprendre. Cet exemple semble être simple et fonctionner, mais je n'ai pas trouvé de solution, comment amener le résultat deGetCurrentNode () -->CObject * à mon typeCMyclass.... Bien sûr, je peux utiliser le constructeurCMyclass, mais j'espère qu'il est possible d ' élaborer une solution soignée en MQL.

 
Igor Makanu:

Merci, ce n'est pas ce que je recherche, votre exemple est en fait une conversion de type via un appel de fonction

SZZ : Je n'ai pas l'habitude de travailler avec des pointeurs dans MQL, j'essaie de comprendre cet exemple simple et fonctionnel, mais je n'ai pas trouvé de solution pour amener le résultatGetCurrentNode () -->CObject * vers mon typeCMyclass..... Bien sûr, je peux utiliser leconstructeurCMyclass, mais j'espère qu'il existe une solution intelligente pour la conversion de type dans MQL.

Je n'ai pas de fonctions à cet endroit, mon problème est celui que vous avez décrit. Ma classe de base est CNode ( qui possède des méthodes Prev(), Next(), etc.) La boucle appelle des champs de COrder, qui est son descendant. La boucle est déclarée dans les définitions 1 fois et est ensuite utilisée partout.

 
Ilya Malev:

Je n'ai pas de fonctions ici, mais c'est exactement la tâche que vous avez décrite. J'ai un CNode ( qui a des méthodes Prev(), Next(), etc.) comme classe de base de la liste, et la boucle appelle les champs de COrder, qui est son descendant. La boucle appelle les champs de COrder, qui est son descendant. La boucle est déclarée dans les définitions 1 fois et est ensuite utilisée partout.

J'ai essayé de suivre votre exemple, mais je veux utiliser typedef

#property strict
#include <Object.mqh>
#include <Arrays\List.mqh>
//+------------------------------------------------------------------+
class CMyclass:public CObject
  {
public:
   int               x;
   double            y;
   void              CMyclass(void):x(-1),y(-2.2) { }   
  };
  
typedef CMyclass (*PtrCMyclass)(CObject*); 
PtrCMyclass Myclass;
//+------------------------------------------------------------------+
void OnStart()
  {
   CList *base=new CList;
   for(int i=0;i<3;i++)
     {
      base.Add(new CMyclass);
      Myclass(base.GetCurrentNode()).x = 99;
      Myclass(base.GetCurrentNode()).y = -555.5;
     }
   for(int i=0;i<3;i++)
     {
      Print(Myclass(base.GetNodeAtIndex(i)).x," : ",Myclass(base.GetNodeAtIndex(i)).y);
     }
   delete base;
  }
//+------------------------------------------------------------------+

Maintenant, le compilateur saute mon exemple, mais j'ai besoin ... quelque chose est nécessaire ... mais quoi ? Je reçois une erreur lors de l'exécution :

Appel de pointeur de fonction non valide dans 'tst_file.mq4' (30,7)