Erreurs, bugs, questions - page 1356

 
Je n'ai pas reçu de mise à jour depuis un moment : MetaTrader5 build 1159 (connecté à MetaQuotes-Demo). Le compilateur de commande charge le build 1162
 
Vasiliy Sokolov:

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.

Voici une comparaison des pointeurs en C++ et des descripteurs en MQL/C# et quelques autres langages.

Le défi : vous voulez discuter en direct avec un ami.

1. Pointeurs. Nous connaissons la rue, le numéro de la maison et l'appartement. Nous allons à l'adresse, réveillons l'ami, obtenons une bulle, il est excité et bavarde ;)).

2. Descripteurs. Nous ne connaissons pas l'adresse exacte, personne n'est autorisé à entrer dans la maison, par exemple, c'est le bâtiment du FSB. Il y a un point de contrôle dans la maison, qui refuse de dire l'adresse par le nom d'un ami (par descripteur), refuse de laisser entrer la maison (dans l'espace adresse). La sécurité appelle le copain et lui demande de sortir. Il sort, vous sortez joyeusement la bulle, il siffle, -qu'est-ce que vous êtes !!!! rangez-la immédiatement ! !! En rentrant chez vous, une bouteille non ouverte à la main, vous vous rendez compte avec stupeur que les descripteurs offrent une sécurité en échange de capacités de signalisation.

 
Vasiliy Sokolov:

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

Pas d'autres arguments ?
 
A100:
Pas d'autres arguments ?
Et vous ?
 
A100:
J'ai des bouts 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.
Argument intéressant, il faut du temps pour y réfléchir. Veuillez créer une demande, nous en discuterons en détail.
 

Au fait, pourquoi ne pas introduire les opérateurs * et & dans MQL pour permettre l'accès explicite à un objet dans le premier cas, et la prise d'un pointeur d'objet dans le second (au lieu de l'encombrant GetPointer). L'astérisque est indispensable, et il ne peut être remplacé par rien dans le langage.Sans cela, il est impossible de contrôler des situations comme celle décrite par A100 ci-dessus, lorsqu'au lieu des objets eux-mêmes, des actions de pointeur sont effectuées. Personnellement, c'est un problème constant, je dois être constamment sur le qui-vive ou spécifier A.operator=(B), A.operator!=(B) partout, c'est-à-dire que la brièveté est perdue, et la surcharge des opérateurs devient en fait sans signification.

J'ai déjà soulevé ce problème une fois, mais le sujet est resté bloqué. Finissons-en enfin avec ce problème.

 

Question sur les variables externes.

J'ai été confronté à une situation où la variable externe change pendant l'exécution du programme, mais lorsque le délai est modifié, elle reprend la valeur définie dans la fenêtre des propriétés. Par exemple, si avant le démarrage, je règle TradeEnable sur EnableAll et que je change la valeur en EnableBuy pendant l'exécution du programme, lorsque le graphique passe à une autre période, la valeur revient à EnableAll. La valeur que je définis dans l'événement du timer et la sortie par Commentaire, il ne peut y avoir d'erreur.

enum ETradeEnable {EnableAll, EnableBuy, EnableSell, DisableAll};
extern ETradeEnable TradeEnable = EnableAll;

La variable TradeEnable n'est pas affectée par le basculement des graphiques. Lire le manuel - Contrairement aux variables d'entrée, les valeurs des variables externes peuvent être modifiées de manière programmatique pendant l'exécution du programme.

C'est ainsi que OnDeinit et OnInit sont configurés.

Question : Je ne comprends pas quelque chose ou le changement de TradeEnable est une erreur d'exécution ?

int LastDeinitReason = 0;

void OnDeinit(const int reason)
{
    LastDeinitReason = reason;
    if(reason==REASON_CHARTCHANGE || reason==REASON_TEMPLATE || reason==REASON_PARAMETERS)
        return;
    EventKillTimer();
// далее код при завершении работы советника
}

int OnInit()
{
    if(LastDeinitReason==REASON_CHARTCHANGE || LastDeinitReason==REASON_TEMPLATE)
    {
        LastDeinitReason = 0;
        return(INIT_SUCCEEDED);
    }
    if(LastDeinitReason==REASON_PARAMETERS)
    {
        SetParams();
        return(INIT_SUCCEEDED);                              
    }
// далее код инициализации при запуске
}
 
Alexey Navoykov:

Finissons-en enfin avec cette question.

Deux opérateurs y sont sacrifiés (== et !=) afin de préserver tous les autres.

Je vois une sortie dans un schéma.

template<typename T1, typename T2>
bool IsEqualPointer( const T1 *t1, const T2 *t2 )
{
    return ( ulong(t1) == ulong(t2) );
}

Si l'opérateur==(!=) est défini, il sera appelé. S'il n'est pas défini, les pointeurs seront comparés à l'égalité. Et si l'opérateur==(!=) est défini et qu'il est nécessaire de comparer les pointeurs sur l'égalité, cela peut être fait par le biais du modèle spécifié.

Les modifications apportées au système existant sont minimes et l'essentiel est qu'elles n'affecteront pas ceux qui se contentent de comparer des pointeurs à l'égalité sans surcharge de l'opérateur==(!=).

 
A100:

Deux opérateurs y sont sacrifiés (== et !=) afin de préserver tous les autres.

Je vois une sortie dans un schéma.

Si l'opérateur==(!=) est défini, il sera appelé. S'il n'est pas défini, les pointeurs seront comparés à l'égalité. Et si l'opérateur==(!=) est défini et qu'il est nécessaire de comparer les pointeurs sur l'égalité, cela peut être fait par le biais du modèle spécifié.

Les changements dans le système existant sont minimes et l'essentiel est qu'ils n'affecteront pas ceux qui se contentent de comparer des pointeurs sans surcharge de l'opérateur==(!=).

Bien sûr, vous pouvez effectuer la comparaison et l'affectation au moyen de fonctions distinctes, mais à quoi bon ? Le but est de convaincre les développeurs de trouver une solution adéquate.

 
Au fait, je ne comprends pas ce code, où l'opérateur== sera-t-il appelé ? Il compare simplement deux longs, c'est tout.