Bibliothèque de classes génériques - bogues, description, questions, caractéristiques d'utilisation et suggestions - page 27

 
Artyom Trishkin:
  1. Je voulais dire que la suppression automatique par le sous-système terminal de tous vos objets créés et mettre des pointeurs vers eux dans des listes vous appelez une béquille, et vous ne considérez pas la manipulation manuelle des objets et la création de béquilles pour le faire comme une béquille
  2. Cela ne faisait pas partie de ce que vous avez dit au point 1, et c'est la raison principale de ma réponse.
  3. Cela aussi, et pour la même raison.

pour les collections et la suppression automatique des objets). Je n'ai pas du tout parlé de fonctionnement manuel. Où as-tu trouvé ça ?)

Étudiez la STL et vous comprendrez de quoi je parle.

 
Igor Makanu:

comment copier correctement, pouvez-vous donner un exemple pour ce modèle ?

J'ai utilisé l'aide pour écrire la méthode AddValuehttps://www.mql5.com/ru/docs/basis/types/classes.

Je me suis creusé la tête, mais je ne vois pas d'autre solution dans MQL que celle que j'ai écrite dans mon exemple !

Montrez-moi votre mise en œuvre d'un stockage correct des données.

C'est ce que je voulais dire dans votre cas.
void  AddValue (const T &value)  { Tptr = new T(value); mlist.Add(Tptr); }

Mais cette solution est de toute façon erronée. Une solution normale est d'utiliser quelque chose comme STL. Dans votre cas, std::list.

Je pense que MQL5 ne le limite pas. Vous pouvez essayer de traduire les sources STL du même VS en MQL.

 
Dans l'ancienne génération de modérateurs, il y avait au moins deux programmeurs professionnels. Maintenant, il n'y en a plus.)
 
Andrey Pogoreltsev:
C'est ce que je veux dire dans votre cas.

Mais c'est toujours la mauvaise solution. La solution normale est d'utiliser quelque chose comme STL. Dans votre cas, std::list.

Je ne pense pas que MQL5 ne le limite pas. Vous pouvez essayer de traduire le code source STL de VS à MQL.

Encore une fois : MQL n'est pas C++,

et un pointeur vers un objet dans MQL est en fait un handle, et un pointeur dans C++ est une adresse de mémoire physique.

Quel est l'intérêt de porter les bibliothèques C++ vers MQL ?

 
Igor Makanu:

Encore une fois : MQL n'est pas C++,

et un pointeur vers un objet dans MQL est en fait un handle, et un pointeur dans C++ est une adresse mémoire physique.

Quel est l'intérêt de porter les bibliothèques C++ vers MQL ?

Pour mettre en œuvre correctement les modèles de conception au lieu de créer des problèmes potentiels en utilisant des génériques.

Vous devez être surpris mais les pointeurs du système d'exploitation sont également virtuels. Vous devez toujours les convertir en éléments physiques, mais il s'agit d'un niveau de travail complètement différent avec les pointeurs.

Vous ne serez pas en mesure de porter 1 en 1, mais je pense que vous serez en mesure de porter un C++03 dépouillé. Une assistance pour les modèles et les opérateurs est disponible.

 
Andrey Pogoreltsev:

1. Vous serez peut-être surpris, mais les pointeurs pour le système d'exploitation sont également virtuels. Il faut encore les convertir en éléments physiques, mais c'est un tout autre niveau de manipulation des pointeurs.

2. Vous ne pourrez pas porter 1 en 1 mais vous pourrez porter le C++03 dépouillé. Le support des modèles et des opérateurs est également présent.

1. je ne serais pas surpris

2) Voici la vérité - même si vous vous réunissez et faites un portage à partir de C++, cela posera toujours des questions, mais pourquoi pas comme dans l'original ? - quel est le but ?

Il y a une bibliothèque standard de MQL, en l'utilisant au moins une sorte de garantie que le soutien sera fourni par les développeurs à l'avenir. J'ai déjà été brûlé un couple de fois - j'ai utilisé des composants graphiques à partir d'articles écrits il ya quelques années, il est facile à utiliser, un peu comme travailler avec des composants Delphi, mais quand j'ai commencé à essayer de mettre en œuvre des projets plus sérieux, j'ai eu beaucoup de questions et aucune réponse de l'auteur de l'article

Je ne me rappelle pas qui des éminents programmeurs a dit, mais quelque chose comme ceci : le code ne doit pas être beau ou lisible, il doit remplir sa fonction.

lors de notre discussion, si je ne me trompe pas, vous vouliez stocker une structure avec vos données dans des listes, je vous ai montré mon implémentation, que j'ai développée pour la même tâche - mon implémentation fonctionne-t-elle ? - Cela provoque-t-il des erreurs d'exécution dans les programmes MQL ? - Je suis curieux de découvrir au cours de la conversation

 

Andrey Pogoreltsev:

Le C++03 est possible, je pense. Un support pour les modèles et les opérateurs est disponible.

Eh bien oui, bonne chance !)

 
Igor Makanu:

Le code ne doit pas être joli ou lisible, il doit faire son travail.

Cela n'est vrai que jusqu'à ce que vous vouliez l'affiner.

 

J'ai déjà signalé ce bogue dans la classe CLinkedList, mais je vais le répéter. Les nœuds de début et de fin de la liste sont fermés l'un à l'autre : le suivant du dernier nœud pointe vers le premier nœud, tandis que le précédent du premier nœud pointe vers le dernier. En conséquence, la boucle de recherche standard se transforme en une boucle infinie :

#include <Generic\LinkedList.mqh>

void OnStart()
{
  CLinkedList<string> list;
   
  list.AddLast("One");
  list.AddLast("Two");
  list.AddLast("Three");
  int i=0;
  for (CLinkedListNode<string> *node= list.First();  node!=NULL;  node=node.Next())  // Цикл бесконечно бегает по кругу
    { }
} 

En C#, de telles absurdités ne sont naturellement pas observées. Le Next du dernier nœud est égal à zéro, de même que lePrevious du premier nœud.

Je ne sais pas si c'est une "fonctionnalité" inventée par les développeurs (bien que je ne vois pas son utilité), mais en tout cas le comportement de la bibliothèque devrait correspondre à celui d'origine.

 
Alexey Navoykov:

J'ai déjà signalé ce bogue dans la classe CLinkedList, mais je vais le répéter. Les nœuds de début et de fin de la liste sont fermés l'un à l'autre : Next du dernier nœud pointe vers le premier nœud, tandis que Previous du premier nœud pointe vers le dernier. En conséquence, la boucle de recherche standard se transforme en une boucle infinie :

En C#, naturellement, il n'y a pas de telles absurdités. Le Next du dernier noeud est zéro, de même que lePrevious du premier noeud.

Je ne sais pas s'il s'agit d'une "fonctionnalité" inventée par les développeurs (bien que je n'en voie pas l'utilité), mais en tout cas le comportement de la bibliothèque devrait correspondre à l'original.

Qu'est-ce qui se passe encore ici ? Ils suppriment de très bons messages sur LinkedList. Juste comme ça, quelque part en Europe, un modérateur anonyme supprime les messages de Russes détestés en ricanant malicieusement. Quel dépotoir, ça te donne pas envie d'écrire.