Erreurs, bugs, questions - page 1182

 
marketeer:
Comment ça, "rien" ? La traduction aurait dû me donner quelque chose, comme le fait que je dois sélectionner au moins un paramètre pour l'optimisation et m'assurer que le début, la fin et l'étape du test sont corrects.
C'est tellement bizarre, je ne comprends rien, peut-être que je suis juste fatiguée, je lutte toujours contre les erreurs pour le deuxième jour. Merci, je me fierai à vos paroles.
 

J'ai été confronté à ce problème : j'ai besoin de comparer deux objets de la même classe entre eux et j'ai décidé de surcharger l'opérateur == pour des raisons de commodité. Il s'est avéré que si les objets sont dynamiques, mon opérateur n'est pas exécuté, et au lieu des objets eux-mêmes, leurs pointeurs sont comparés. En principe, cela a du sens, l'opération de saut à l'objet par son pointeur est nécessaire : *a == *b. Mais dans MQL cette possibilité a été oubliée. Nous devons ajouter.

class T {   int x;

public:

T (int value) { x=value; }   bool operator==(T& other) { Print("compare1");  return x==other.x; }   bool operator==(T* other) { Print("compare2");  return x==other.x; } }; //------------------ void OnStart() {   T* a= new T(10);   T* b= new T(10);      Alert(a==b);      delete a;   delete b; }

 

Bien que je vienne de réfléchir, le fait que nous comparions des pointeurs au lieu d'objets est fondamentalement erroné, compte tenu des spécificités du langage. Après tout, MQL est un langage géré, et le concept même d'"objet" est utilisé ici indépendamment de la façon dont l'objet est stocké et de la façon dont on y accède. Les membres et les méthodes sont dans tous les cas accessibles par un point. De même, l'opérateur de comparaison doit fonctionner de la même manière pour les objets sélectionnés de manière statique et pour les objets dynamiques. Et si vous devez comparer des pointeurs, vous devez le faireen utilisant GetPointer().

 
meat:

Bien que j'étais en train de penser, le fait qu'il y ait une comparaison des pointeurs au lieu des objets eux-mêmes est fondamentalement faux, étant donné les spécificités du langage.

Il n'est pas nécessaire d'inventer des règles de comparaison dans MQL qui contredisent C++, tant que vous pouvez le faire par d'autres moyens. Si vous avez des pointeurs et que vous devez comparer des objets, utilisez une fonction de comparaison.
bool Compare(const T& t1, const T& t2 ) { return ( t1 == t2 ); }

Alert( Compare( a, b ));
C'est une chose d'autoriser un enregistrement de la forme (*a == *b) et c'en est une autre de donner un sens différent à cet enregistrement (a == b).
 

Lorsque l'on teste le conseiller expert, il génère une erreur

Prise de profit invalide pour la fonction OrderSend

Erreur 4107 de OrderSend

Comment puis-je le réparer sans entrer dans le code ?

 
A100:
Il n'y a pas besoin d'inventer des règles de comparaison dans MQL qui contredisent C++, tant que d'autres moyens peuvent être utilisés. Si vous avez des pointeurs et que vous devez comparer des objets, utilisez une fonction de comparaison C'est une chose de suggérer d'autoriser une entrée du type (*a == *b), et c'en est une autre de donner une signification différente à l'entrée (a == b)

Eh bien, j'explique que les règles de MQL contredisent le C++ tel qu'il est. Se référer à un objet par un pointeur ici est fait avec un point, alors que cela devrait être fait avec ->, si nous suivons les règles du C++.

C'est-à-dire que "pointeur" et "objet" sont deux notions absolument différentes en C++, c'est pourquoi la syntaxe est différente. Tout est strict. Mais ici, tout est mélangé en un seul bloc. On dirait que l'on s'adresse aux propriétés et aux méthodes d'un pointeur. Je ne dis pas que c'est mauvais, c'est plus pratique pour la POO, c'est ce qui est fait en C# par exemple. Mais alors tout le reste doit être implémenté de la même manière. Il doit y avoir un seul concept. Sinon, il y a des contradictions et des confusions : dans certains cas, nous utilisons un pointeur de la même manière que l'objet lui-même, et dans d'autres cas, le pointeur prend soudainement vie.

Pour passer à l'aspect pratique de tout cela, j'ai déjà été confronté à un problème : mon code utilisait des objets statiques. Puis j'ai décidé de remplacer certains d'entre eux par des objets dynamiques. En conséquence, les opérations de comparaison et d'affectation ont commencé à fonctionner de manière très différente. Et ce problème était difficile à détecter car le programme continue à compiler et à fonctionner normalement mais pas comme il le devrait.

 

J'ai une classe dans mon code qui contient un objet :

CClass
{
  ...
  CObj  Object; 
  ...
};

La classe CObj est déclarée avant elle.

Lorsque j'essaie de compiler, j'obtiens l'erreur suivante : 'Object' - cannot be unset (Objet - ne peut être désactivé)

Que signifie cette erreur et quelle en est la cause ? Je ne me souviens pas avoir rencontré cette erreur auparavant. La classe CObj possède un constructeur et un destructeur.

J'ai essayé de déclarer Object simplement comme une variable - tout est OK. Mais il ne le fera pas quand il fait partie d'une classe.

 
Quelqu'un peut-il expliquer ce qu'est cette erreur ("- cannot be unset") et quand elle se produit ?
 
meat:
Quelqu'un peut-il expliquer ce qu'est cette erreur ("- cannot be unset") et quand elle se produit ?
La fonction ZeroMemory ne peut pas être utilisée pour cet objet.
 
Zeleniy:

Lorsque l'on teste le conseiller expert, il génère une erreur

Prise de profit invalide pour la fonction OrderSend

Erreur 4107 de OrderSend

Comment puis-je le réparer sans entrer dans le code ?

dans les réglages, essayez d'augmenter ou de diminuer le takeprofit
Raison: