Erreurs, bugs, questions - page 1576

 
Renat Fatkhullin:

Je n'interviens pas. J'ai 26 ans de programmation non-stop à mon actif.

Les avertissements sont essentiellement des erreurs si l'on parle du secteur financier. Et les milliers de rapports de "perte de signe, perte de précision, perte de fantômes, etc. Apparemment, vous ne comprenez pas bien les implications.

Veuillez fournir sous une forme suffisamment complète le morceau de code que le compilateur a signalé comme une erreur.

Sans cela, toute cette discussion semble inesthétique et injuste.

Ok, Renat, ces arguments sur la "qualité du code" n'ont rien à voir avec le sujet de la discussion. Car nous ne parlons ici que de la compilabilité, c'est-à-dire de l'exploitabilité du code. Et la perte de précision, etc. - il s'agit d'une affaire personnelle du programmeur, c'est-à-dire de sa responsabilité. La conversion implicite, par exemple de int en short, n'est pas interdite par la norme linguistique, n'est-ce pas ? Alors pourquoi prêcher maintenant ?

OK, j'ai trouvé un de ces bugs :

class CClass
{

};


class CArr
{
  CClass* data[];
 public: 
  CClass* operator[] (int i)  { return data[i]; }
};


template<typename T>
void Func (T* obj)      {  }
 

void OnStart()
{  
  CArr arr;
  Func(arr[0]);
}

que j'obtiens dans le journal :

CClass' - déclaration sans type TestScript.mq5 16 9
'CClass' - virgule attendue TestScript.mq5 16 9

Dans les versions précédentes, tout allait bien.

 
Alexey Navoykov:

OK, Renat, ces arguments sur la "qualité du code" n'ont rien à voir avec le sujet de la discussion. Car nous ne parlons ici que de la compilabilité, c'est-à-dire de l'exploitabilité du code. Et la perte de précision, etc. - il s'agit d'une affaire personnelle du programmeur, c'est-à-dire de sa responsabilité. La conversion implicite, par exemple de int en short, n'est pas interdite par la norme linguistique, n'est-ce pas ? Alors pourquoi prêcher maintenant ?

2600 endroits potentiellement problématiques, et même dans les finances - ce n'est pas une morale, mais exactement l'indicateur de la qualité du code.


OK, j'ai trouvé un de ces bugs :

que j'obtiens dans le journal :

Dans les versions précédentes, tout allait bien.

Oui, ce bug a déjà été discuté (probablement, avec l'A100) et corrigé le 4 mai. J'en ai trop fait avec le contrôle de la typographie, apparemment.

J'ai joint la dernière version de MetaEditor, build 1329, qui ne présente pas cette erreur. Veuillez le vérifier ici.

Le lancement de MT5 aura lieu le 12 mai.

Dossiers :
 
Alexey Navoykov:

C'était bien dans les versions précédentes.

Dans votre code, vous ne retournez pas un const-pointer vers un objet privé. Il s'avère que les fonctions tierces (en termes de visibilité des variables) peuvent modifier en apparence quelque chose qui ne devrait pas leur être accessible architecturalement, puisque le programmeur a spécifié private.

Chaque fois que je veux renvoyer un pointeur vers un objet privé, je dois nécessairement spécifier un modificateur const. Dans votre cas, je mettrais une déformation.

Je ne suis pas un oiseau de haut vol, alors je demande. Faut-il utiliser ce code quelque part ou est-ce que c'est juste paresseux de mettre const ?

 
A100:

Deux jours perdus pratiquement tout le temps (à mon âge c'est déjà beaucoup), et j'avais prévu de les utiliser d'une manière un peu différente.

Vous avez cité plus d'une centaine de bugs. Chaque fois qu'une telle quantité sauvage de votre temps ?! D'où vous vient cette générosité envers les développeurs ?
Alexey Navoykov:

Donc, une fois de plus, je tire mon chapeau à A100 pour sa patience. J'en suis moi-même fatigué, c'est plus facile pour moi de m'asseoir sur l'ancienne version, qui fonctionne bien, que de chercher les causes des bugs dans la nouvelle version, en travaillant sur le service-desk. Ou quelqu'un me paiera pour ce travail ?

Oui, servicedesk est une chose cool que les testeurs tiers peuvent faire gratuitement. Il est évident qu'il n'a pas été conçu pour cela, mais en fait, il est devenu exactement l'employeur des testeurs tiers travaillant gratuitement. Sans ces rapports de bogue, la compilation du compilateur aurait pris beaucoup plus de temps.

Tout le monde dira qu'il devrait y avoir une rétribution pour la découverte d'un bogue, comme c'est la pratique dans le monde. A100 devrait recevoir le salaire du testeur de l'État. Et apparemment un an de salaire de testeur.

 
Renat Fatkhullin:

Oui, cette erreur a déjà été discutée (peut-être avec l'A100) et corrigée dès le 4 mai. Ils ont exagéré le contrôle du type, apparemment.

J'ai joint le dernier MetaEditor build 1329 qui ne contient pas cette erreur. Veuillez le vérifier ici.

Le lancement de MT5 aura lieu le 12 mai.

Vérifié. Il n'y a presque pas d'erreurs de compilation maintenant, à l'exception de certaines merveilles étranges que je ne peux pas reproduire séparément du programme, mais que je parviens à contourner d'une manière aléatoire.

Voici un exemple de code de la zone problématique dont je vais vous parler. Là encore, il se compile bien séparément mais génère une erreur dans mon programme.

class CBase
{
};


class CClass : public CBase
{
};

 

class CWork
{
 public:
 
  template<typename T>
  void Run(T& arr[])
  {
    struct Struct
    {
      template<typename T1> static void Set(T1& main,  T& arr[], CBase& obj)   { main.Set(arr); } 
    };
    
    Struct structobj;
    
    structobj.Set(this, arr, arr[0]);
  }

  
  template<typename T>
  void Set(T& arr[]) 
  {  
    for (int i=0; i<ArraySize(arr); i++) Set(arr[i]);  // Здесь возникает ошибка: 'arr' - parameter conversion not allowed
  }
  
  template<typename T>
  void Set(T& obj)    { } 
  
  template<typename T>
  void Set(T*& obj)    { } 

};
 
 

void Main()
{
  CWork work;
  CClass arr[];
  work.Run(arr);

  return;
}

Si vous ajoutez une ligne dans la fonction Main à n'importe quel endroit (par exemple, après le retour) :

travail.Set(arr[0]) ;

il compile normalement.

Le programmeur semble être allé trop loin dans l'optimisation.

Et il y a aussi quelques pépins dans le temps d'exécution. Par exemple, j'assigne une valeur à un membre de la structure, mais il s'avère que la valeur qui s'y trouve est ancienne, c'est-à-dire que rien n'a été assigné. Si j'ajoute une ligne avec une opération arbitraire à proximité, tout devient normal. Ces bogues ont commencé depuis cette construction d'automne où vous avez optimisé le compilateur. Dans l'ensemble, tout est encore brut.

En outre, la compilation elle-même prend encore 20 secondes, alors que la build 1159 ne prenait que 1 à 2 secondes. En même temps, je ne remarque pas d'accélération significative de mes programmes, le gain est de l'ordre de 10 à 20 %. Vous pouvez donc oublier ces histoires de gain de vitesse de 2 à 10 fois. Peut-être que cela se produit avec des échantillons de test spécialement sélectionnés, mais nous avons de vraies applications, pas des fausses.

Au total, une compilation 10 à 20 fois plus lente pour une performance un peu plus élevée. À mon avis, cela n'en vaut pas la peine. Le temps perdu par le programmeur est bien plus précieux.

Je suis toujours obligé de rester sur la version 1159.

 
Anton Zverev:

Dans votre code, vous ne retournez pas un const-pointer vers un objet privé. Il s'avère que les fonctions tierces (en termes de visibilité des variables) peuvent modifier en apparence quelque chose qui ne devrait pas leur être accessible architecturalement, puisque le programmeur a spécifié private.

Chaque fois que je veux renvoyer un pointeur vers un objet privé, je dois nécessairement spécifier un modificateur const. Dans votre cas, je mettrais une déformation.

Je ne suis pas un oiseau de haut vol, alors je demande. Faut-il utiliser ce code quelque part ou est-ce que c'est juste paresseux de mettre const ?

Je ne fais que cacher un tableau en privé alors que les objets CClass eux-mêmes sont disponibles à un utilisateur pour un accès complet, c'est le but. Si je n'en avais besoin que pour la lecture, je mettrais const.

 
Anton Zverev:
Tous soutiendront qu'il devrait y avoir une rétribution pour la découverte d'un bogue, comme c'est la pratique dans le monde. A100 devrait recevoir un salaire de testeur d'état. Et apparemment un an de salaire de testeur.
Je soutiens cette idée, mais je crains qu'elle ne se limite à une plaque et à une lettre d'éloge :)
 

Je ne sais pas s'il s'agit d'un bug ou simplement d'une mauvaise description des méthodes CDealInfoPositionId() etTicket(). J'ai écrit le code suivant

//+------------------------------------------------------------------+
//|                                                      test_01.mq5 |
//|                                                   Sergey Gritsay |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Sergey Gritsay"
#property link      "https://www.mql5.com"
#property version   "1.00"
#include <Trade\Trade.mqh>
//#include <Trade\DealInfo.mqh>
CTrade trade;
CDealInfo deal;
ulong  ticket_deal;      // тикет сделки
ulong  ticket_position;     // тикет позиции
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//---
   trade.Buy(0.1,_Symbol);
   ticket_deal=trade.ResultDeal();
   deal.Ticket(ticket_deal);
   ticket_position=deal.PositionId();

   Print("ResultDeal() = ",ticket_deal);
   Print("deal.PositionId() = ",ticket_position);
  }
//+------------------------------------------------------------------+

résultat

NM      0       14:06:49.083    test_01 (EURUSD,H1)     ResultDeal() = 69380150
QE      0       14:06:49.083    test_01 (EURUSD,H1)     deal.PositionId() = 0

J'ai ajouté une requête pour l'historique des transactions en utilisant la fonctionHistorySelect().

//+------------------------------------------------------------------+
//|                                                      test_01.mq5 |
//|                                                   Sergey Gritsay |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Sergey Gritsay"
#property link      "https://www.mql5.com"
#property version   "1.00"
#include <Trade\Trade.mqh>
//#include <Trade\DealInfo.mqh>
CTrade trade;
CDealInfo deal;
ulong  ticket_deal;      // тикет сделки
ulong  ticket_position;     // тикет позиции
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//---
   trade.Buy(0.1,_Symbol);
   ticket_deal=trade.ResultDeal();
   HistorySelect(0,TimeCurrent());
   deal.Ticket(ticket_deal);
   ticket_position=deal.PositionId();

   Print("ResultDeal() = ",ticket_deal);
   Print("deal.PositionId() = ",ticket_position);
  }
//+------------------------------------------------------------------+

résultat

JM      0       14:16:33.055    test_01 (EURUSD,H1)     ResultDeal() = 69381116
EF      0       14:16:33.055    test_01 (EURUSD,H1)     deal.PositionId() = 83654708
 
Alexey Navoykov:

Dans private, je ne cache que le tableau, et les objets CClass eux-mêmes sont disponibles à l'utilisateur pour un accès complet, c'est le but. Si j'avais besoin qu'il soit en lecture seule, je mettrais const.

Je vois. Pouvez-vous me dire dans quelles constructions cela peut être utile ? Je comprends qu'avec cette approche, vous ne pouvez rien faire avec le tableau lui-même (redimensionner, échanger des éléments, etc.). supprimer, cependant, peut être appliqué...

Je suppose que vous le faites quelque part avec un modèle, de sorte qu'il y ait la même syntaxe de l'opérateur [] pour différents types d'objets. D'une manière générale, pourriez-vous montrer l'utilisation de cette construction lorsque c'est opportun.

 
Renat Fatkhullin:
J'ai joint la dernière version de MetaEditor build 1329 qui n'a plus cette erreur. Veuillez vérifier.

La sortie de MT5 aura lieu le 12 mai.

Je suggère que les liens vers les dernières versions de metaeditor.exe et metaeditor64.exe soient postés en permanence, comme cela a été le cas pour mql.exe(http://files.metaquotes.net/metaquotes.software.corp/mt5/mql.exe) et mql64.exe, afin que chacun puisse télécharger et tester le compilateur sans attendre la sortie de la version.