Erreurs, bugs, questions - page 2471

 
Artyom Trishkin:
Un nouvel objet l est créé. Et il n'est pas supprimé.

logiquement

Mais la portée des variablesCChartObjectLabel *LabelUP,*LabelDN ; est globale ?

Je peux donc modifier la variable à n'importe quel moment du code ?

Je passe un pointeur à la fonction CreateLabel(), pourquoi dois-je créer une nouvelle copie ?

imho, il ne fonctionne pas correctement.

HH : Si je crée des objets dans OnInit() et que je travaille ensuite avec eux dans CreateLabel() (c'est-à-dire que je crée les objets séparément et que je travaille avec eux par pointeur), tout fonctionnera correctement - mais je ne me souviens pas d'un cas dans d'autres compilateurs pour passer un pointeur à une fonction pour créer un nouvel objet - un pointeur, c'est un pointeur !

 
Igor Makanu:

logiquement

mais mon champ d'application est global ? - cela signifie que je peux modifier une variable dans n'importe quelle partie de mon code ?

Je passe un pointeur à CreateLabel(), pourquoi est-ce que je reçois une nouvelle copie ?

A mon avis, cela ne fonctionne pas correctement.

En réaffectant un pointeur à un nouvel objet, on perd l'objet précédent sur lequel pointait le pointeur réaffecté.
 
Igor Makanu:

logiquement

Mais la portée des variablesCChartObjectLabel *LabelUP,*LabelDN ; est globale ?

Je peux donc modifier la variable à n'importe quel moment du code ?

Je passe un pointeur à la fonction CreateLabel(), pourquoi dois-je créer une nouvelle copie ?

Imho, cela ne fonctionne pas correctement

le nouveau doit être retiré. Il existe déjà des objets et des pointeurs vers eux.
 
Artyom Trishkin:
En réassignant un pointeur à un nouvel objet, on perd l'objet précédent, qui était pointé par le pointeur réassigné.

non, un pointeur est un pointeur, dans MQL c'est un descripteur, pas le point - mais il n'est pas correct de créer une nouvelle copie de l'objet, cela fonctionne correctement maintenant :

//+------------------------------------------------------------------+
//|                                                         test.mq4 |
//|                        Copyright 2018, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2018, MetaQuotes Software Corp."
#property link      "https://www.mql5.com/ru/users/igorm"
#property version   "1.00"
#property strict
#property indicator_separate_window
#include <ChartObjects\ChartObjectsTxtControls.mqh>
CChartObjectLabel *LabelUP,*LabelDN;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
   LabelUP=new CChartObjectLabel;
   LabelDN=new CChartObjectLabel;
   SetLabel(LabelUP,"LabelUP",0);
   SetLabel(LabelDN,"LabelDN",25);
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   delete LabelUP;
   delete LabelDN;
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
   return(rates_total);

  }
//+------------------------------------------------------------------+
void SetLabel(CChartObjectLabel *l,string name,int y)
  {
   l.Create(0,name,ChartWindowFind(),0,y);
   l.Color(clrYellow);
   l.FontSize(14);
   l.Description(name);
  }
//+------------------------------------------------------------------+

mais si vous suivez votre logique, alors ce code créera aussi une copie de l'objet l dans la fonction SetLabel() - j'ai passé un pointeur, pas une référence ?


Artyom Trishkin:
nouveau devrait être supprimé. Les objets existent déjà et les pointeurs vers eux aussi.

la question n'est pas de savoir comment résoudre le problème, mais pourquoi dans la portée globale de la variableCChartObjectLabel *LabelUP,*LabelDN ;- a perdu le pointeur !

 
Igor Makanu:

non, un pointeur est un pointeur, dans MQL c'est un descripteur, pas le point - mais il n'est pas correct de créer une nouvelle copie de l'objet, cela fonctionne correctement maintenant :

mais si vous suivez votre logique, alors ce code créera aussi une copie de l'objet l dans la fonction SetLabel() - j'ai passé un pointeur, pas une référence ?

Non. Ici, l est un paramètre de la méthode par lequel nous passons le pointeur nécessaire. Tout va bien ici. Le pointeur reste ici sur l'objet créé précédemment. Ici, on ne crée pas un nouvel objet et on ne lui réaffecte pas le pointeur avec la perte de l'objet précédent.
 
Artyom Trishkin:
Non. Ici, l est le paramètre de la méthode par lequel nous passons le pointeur nécessaire. Tout va bien ici. Le pointeur reste ici sur l'objet créé précédemment. Ici, on ne crée pas un nouvel objet et on ne lui réaffecte pas le pointeur avec la perte de l'objet précédent.

il ne fonctionne toujours pas correctement

ces "pointeurs" en MQL sont faits pour fonctionner dans la portée de la classe, je ne veux pas créer une classe, je déclare un pointeur global et le passe ensuite à n'importe quelle fonction, et le fait que je crée un descripteur de l'objet dans cette fonction n'est pas la raison de détruire l'objet en sortant de la portée locale de la fonction

Je suis un peu occupé en ce moment, mais j'ai besoin de faire des exemples de test sans graphiques - je pense que la même chose se produira si vous entrez dans la fonction avec un pointeur avec la valeur POINTER_INVALID, vous sortirez avec le même POINTER_INVALID , par référence, tout fonctionnera correctement, mais je pense que vous ne pouvez pas passer un pointeur avec POINTER_INVALID par référence - il y aura une erreur d'accès au pointeur

 
Igor Makanu:

tout ne fonctionne pas correctement de toute façon

ces "pointeurs" en MQL sont faits pour fonctionner dans la portée de la classe, je ne veux pas créer une classe, je me contente de forer et de déclarer un pointeur dans la portée globale, puis de le passer à n'importe quelle fonction et le fait que je crée un descripteur d'objet dans cette fonction n'est pas la raison de détruire l'objet en sortant de la portée locale de la fonction

Je pense que ce sera le même problème, si vous entrez avec une valeur POINTER_INVALID dans cette fonction, vous sortirez avec la même valeur POINTER_INVALID, par référence, tout fonctionnera correctement, mais par référence vous ne pouvez pas passer un pointeur avec POINTER_INVALID - une erreur d'accès au pointeur se produira.

Exactement l'objet n'est pas détruit. Après la création d'un nouvel objet dans la méthode, nous avons déjà deux objets. Et il n'y a qu'un seul pointeur - il a été transmis à la méthode en tant que paramètre formel. Ainsi, nous perdons le pointeur sur l'un des objets.
 

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.

template<typename T>
typedef bool (* callback)(T &);

template<typename T>
bool ff(T &){
   return true;
}

bool ff(int &){
   return true;
}


void OnStart(){
   int a;
   ff(a);
   
   callback<int> f_ptr_0 = ff;     //'<' - unexpected token     
   callback f_ptr_1 = ff;          //'ff' - function must have a body   
   callback f_ptr_2 = ff<int>;     //'ff<int>' - cannot resolve function address  //'ff<int>' - type mismatch   
}


Le typedef avec un pointeur vers une fonction modèle est-il une fonctionnalité prévue ?

 
Encore un bug dans le jardin des typedef :
typedef void (* callback)(int &);

template<typename T>
void ff(T &){}


void OnStart(){
   int a = 0;
   //ff(a);                     //  если раскомментировать, то работает
   
   callback f_ptr = ff<int>;    //  'ff<int>' - function must have a body
   f_ptr(a);
}

Lorsque vous travaillez avec typedef, l'utilisation d'une fonction template avec une spécialisation explicite ne génère pas de code pour ce template.
 

Je crée un symbole personnalisé et je le remplis avec 25 ans de barres quotidiennes, cela devrait peser environ 400kb. Cependant, dans le dossier du symbole, des fichiers .hcc sont créés avec une taille totale de 15 mb ! En plus, tout cela prend environ 20 secondes ! C'est hors de question... Comment expliquez-vous cela ?