Erreurs, bugs, questions - page 1355

 
Honnêtement, je n'ai rien vu de mal dans cette conversion, étant donné qu'elle est explicite. Pourquoi y aurait-il une erreur ici ? Si quelqu'un veut une valeur numérique pour un descripteur, il n'y a pas d'erreur.
 
Ilyas:
Mais cela n'a aucun sens de convertir un descripteur en un nombre ou vice versa, et il s'agit très probablement d'un bug dans le code.
J'ai des fragments de code où les pointeurs sont explicitement convertis en nombres (pour l'interfaçage avec des systèmes d'écriture/lecture externes, ainsi que pour l'analyse des erreurs et le débogage), si cela est interdit, la flexibilité sera réduite et nous devrons recommencer.
 
Ilyas:
Bien sûr, en ce qui concerne la "façon dont il est stocké dans la mémoire", vous avez raison.
Mais cela n'a pas de sens de convertir le descripteur en un nombre ou vice versa, et c'est très probablement un bug dans le code.
Dans un avenir proche, si un opérateur de conversion approprié est surchargé dans une classe, il sera appelé.
Il peut y avoir un avertissement ici, mais pas une erreur.
 
Ilyas:
Bien sûr, en termes de "comment c'est stocké dans la mémoire", vous avez raison.
Mais cela n'a pas de sens de réduire le descripteur à un nombre ou vice versa, et c'est très probablement un bug dans le code.
Dans un avenir proche, si un opérateur de conversion approprié est surchargé dans la classe, il sera appelé.

Bien sûr, c'était mon erreur d'inattention, j'ai déjà écrit à ce sujet. J'ai 95% d'erreurs du tout, pas des erreurs de système, mais dues à l'inattention ;)) D'ailleurs, je ne vois pas non plus l'intérêt de transformer un descripteur en un nombre. C'est plus intéressant avec les pointeurs où il y a de l'arithmétique de pointeur, par exemple, vous pouvez décomposer le double en octets ou faire quelque chose de non trivial. Et un descripteur est juste un identifiant interne, donné par le système d'exécution de MT4, vous ne pouvez rien en faire.

C'est ainsi que cette erreur s'est produite, pas besoin d'écrire du code la nuit ;))

// order - это дескриптор экземпляра класса, создается вот так после открытия ордера, потом заносится в CList открытых ордеров.
// COrder* order = new COrder(ticket, symbol, cmd, volume, price, timeOpen, magic, stoploss, takeprofit, comment, expiration);

// так было неправильно, просто я перепутал order с тикетом, забыл, что это же экземпляр класса, уставший был ))
logBuf[logBufCount++] = double(order);

// так правильно
logBuf[logBufCount++] = (double)order.Ticket
 
A100:
Un descripteur est toujours un numéro concret. Le fait qu'il ne pointe pas vers une section particulière de la mémoire ne le prive pas des propriétés du numéro.

Ensuite, la chaîne est aussi un ensemble de chiffres spécifiques. Et une image est aussi un numéro et une impulsion électrique sur une puce...

En général, étudie l'ingénierie électrique, collègue.

 
Alexey Navoykov:
Pour être honnête, je n'ai rien vu de mal dans cette citation, étant donné qu'elle est explicite. Pourquoi y aurait-il une erreur ici ? ...

Parce que le contrôle des types est violé, et l'environnement géré, qui est la machine virtuelle MQL, devrait empêcher de telles choses :

MQL != C++

 
Ilyas:
Bien sûr, en ce qui concerne la "façon dont il est stocké dans la mémoire", vous avez raison.
Mais cela n'a pas de sens de convertir le descripteur en un nombre ou vice versa, et c'est très probablement un bug dans le code.
Dans un avenir proche, si l'opérateur de conversion approprié est surchargé dans une classe, il sera appelé.
Très cool et surtout idéologiquement correct. Deux mains en faveur !
 
Alexey Volchanskiy:

D'ailleurs, je ne vois pas non plus l'intérêt de réduire le descripteur à un nombre quelconque...

Il y a un tel point. Il s'agit d'une propriété très utile pour des conteneurs de données spécifiques, tels que les dictionnaires, où le descripteur, par définition unique, peut être la clé d'une classe. Dans ce cas, il ne sera pas nécessaire de calculer son hachage et, surtout, vous pourrez distinguer l'unicité des objets par référence et par valeur (qui sont en fait des concepts différents). En outre, les classes qui ne sont pas liées les unes aux autres par héritage peuvent être placées dans la collection.
 
Alexey Volchanskiy:

Et le descripteur est juste un identifiant interne donné par le système d'exécution MT4, vous ne pouvez rien en faire.

D'autres le font. Ouvrez de nouveaux horizons.
 
Vasiliy Sokolov:
Très cool et surtout idéologiquement correct. Deux mains en faveur !
Alors ce serait idéologiquement correct
class A { public:
        bool operator !=( A* ) {}
        bool operator  <( A* ) {}
};
void f()
{
    A *a1, *a2;
    a1 != a2; //здесь простое сравнение указателей вместо вызова operator !=()
    a1 <  a2; //здесь вызывается operator <()
}
L'opérateur!=() serait appelé au lieu de comparer les pointeurs à l'égalité comme c'est le cas maintenant. Et la comparaison des pointeurs pourrait être effectuée par une fonction spéciale similaire à ::GetPointer(...)

Mais cela n'est pas fait pour la simple raison que cela entraînerait des inconvénients importants, et que l'avantage ne serait qu'idéologiquement correct...