Erreurs, bugs, questions - page 1183
Vous manquez des opportunités de trading :
- Applications de trading gratuites
- Plus de 8 000 signaux à copier
- Actualités économiques pour explorer les marchés financiers
Inscription
Se connecter
Vous acceptez la politique du site Web et les conditions d'utilisation
Si vous n'avez pas de compte, veuillez vous inscrire
La fonction ZeroMemory ne peut pas être utilisée pour cet objet.
Je vois. Mais pourquoi le compilateur affiche-t-il cette erreur non pas à l'endroit oùZeroMemory est utilisé mais à l'endroit où la classe est définie ? C'est déroutant. Je me suis déjà creusé la tête pour essayer de comprendre quelle est l'erreur et où elle se trouve. Assurez-vous que l'erreur est affichée au bon endroit. Par exemple, lors de la copie d'un objet contenant des éléments non autorisés à être copiés, l'erreur se produit exactement sur la ligne de copie et non quelque part dans la classe.
Pour en venir au côté pratique de tout cela, j'ai déjà rencontré un problème. Le code utilisait des objets statiques. Puis j'ai décidé de remplacer certains d'entre eux par des 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.
Je n'ai pas compris immédiatement le problème
A partir de là, vous pouvez voir que (a != a) conduit à la comparaison de pointeurs alors que (a >> a) conduit à l'appel de l'opérateur >>( A* )Il y a une contradiction.
Vous ne pouvez pas modifier le comportement de (a >> a) comme les autres opérateurs surchargés (à l'exception de == et !=) car cela rendrait la construction suivante impossible, puisque vous ne pouvez pas retourner (A) mais seulement (A*).
Il sera également impossible d'utiliser pleinement les opérateurs surchargés car il n'existe pas d'opération de conversion de pointeur en objet (*a)
La seule chose qui reste à faire est de modifier le comportement de (== et !=)
Pour comparer les pointeurs (== et !=) entre eux et avec le nombre zéro (car les autres opérations sur les pointeurs n'ont aucun sens), il faut introduire une fonction spéciale comme (GetPointer) ou spécifier explicitement une conversion de type au compilateur
Ainsi, la possibilité d'utiliser pleinement les opérateurs surchargés sera préservée et la contradiction susmentionnée sera éliminée.
La seule exception raisonnable à la règle générale devrait rester operator=() car
éliminerait toutes les contradictions d'un seul coup.
Correction : en fait, les contradictions ne sont éliminées que partiellement, parce que cette notation (*a) ne résout pas le problème de l'utilisation multiple des opérateurs (qui fonctionne maintenant avec succès avec tous les opérateurs, sauf == et !=) - donc la meilleure façon de comparer des pointeurs l'un à l'autre sur l'égalité/inégalité est encore d'utiliser une fonction spéciale - ou une conversion explicite au type ulong
c'est bien, et ça
erreur de compilationEn continuant le thème des pointeurs, il serait bien d'ajouter à MQL l'opérateur standard pour prendre un pointeur'&', il serait beaucoup plus pratique et compact que l'encombrant GetPointer.Ainsi, en ayant les opérateurs * et & dans notre arsenal, nous serons en mesure de définir explicitement les opérations nécessaires :
Et il y a plus à propos de cette esperluette. MQL manque de référence aux variables, surtout si l'on tient compte de l'utilisation limitée des pointeurs (uniquement vers les objets de classe). La fonction nécessite souvent l'accès à un élément de structure profondément imbriqué ou à un tableau multidimensionnel. Je dois écrire le chemin complet vers celui-ci à chaque fois, ce qui rend le code très lourd.Vous pouvez simplifier les choses en créant une référence et parfois vous devez juste "changer" le nom d'une variable localement pour des raisons de commodité. Cependant, qu'est-ce que j'explique ici ? Tout le monde sait déjà combien il est pratique d'utiliser des références mais maintenant vous devez utiliser #define à la place, ce qui n'est certainement pas bon.
Et nous avons également besoin de la possibilité de passer le résultat d'une fonction par référence, c'est-à-dire double& Func() { }
Facebook a récemment vu l'émergence du backlinking des publications des blogs :
En restant sur le thème des pointeurs, il serait bon d'ajouter à MQL un opérateur standard pour prendre un pointeur'&', ce serait beaucoup plus pratique et compact que l'encombrant GetPointer.Ainsi, en disposant des opérateurs * et &, nous pouvons définir sans ambiguïté les opérations nécessaires :
Le fait de n'adopter que (*a) pour faire référence aux fonctions membres n'apporte pas d'avantages évidents, mais conduit au contraire à l'impossibilité d'une application multiple simple et claire des opérateurs.
Essayez de le réécrire en tenant compte de votre suggestion.
Vous ne pouvez pas utiliser l'objet lui-même au lieu du pointeur car l'opérateur <<(...) ne peut retourner qu'un pointeur vers l'objet.
Quelles opérations avec des pointeurs sont dénuées de sens ? - Seulement la comparaison entre eux et avec un nombre - par conséquent, ils doivent être négligés et placés dans une fonction spéciale (par exemple, bool ComparePointer( a,b)) afin de préserver la possibilité d'une utilisation multiple des opérateurs sans laquelle la surcharge d'opérateurs elle-même perd son sens.
Quelles opérations sur les pointeurs ne sont pas dénuées de sens ?