Caractéristiques du langage mql5, subtilités et techniques - page 210

 
fxsaber #:

Je ne comprends pas. La remise à zéro est une chose utile, donc c'est logique.

Il y a ZeroMemory pour la mise à zéro, et cette mise à zéro ne fonctionne généralement pas correctement - voici des exemples

 
A100 #:

ZeroMemory sert à mettre à zéro, et cette mise à zéro ne fonctionne généralement pas correctement - voici des exemples

Fonctionne très bien, je l'utilise.

 
fxsaber #:

Ça marche bien, je l'utilise.

Si c'est le cas, pourquoi cet exemple avec F5 se bloque-t-il, mais pas avec ZeroMemory ?

Et pourquoi ici - il compile avec {} maispas avecZeroMemory ?

 
A100 #:

Si c'est le cas, alors pourquoi cet exemple se maintient via F5, mais pas via ZeroMemory ?

Parce que c'est juste un autre bug qui sera corrigé.

Et pourquoi ici - il compile avec {} maispas avecZeroMemory

Dans cet exemple, {} fonctionne.

 
fxsaber #:

Dans cet exemple, {} fonctionne.

C'est un bug qui fonctionne et qui sera également corrigé - et il ne compilera pas.

 
A100 #:

C'est un bug qui fonctionne et qui sera corrigé aussi - et il ne compilera pas.

Alors, de quoi se plaint-on ? Je ne vois aucune raison de ne pas utiliser le {}-mécanisme dans les endroits où la vitesse est critique.

 
fxsaber #:

Alors, de quoi se plaint-on ? Je ne vois aucune raison de ne pas utiliser le {}-mécanisme dans les endroits où la vitesse est critique.

Parce qu'un mécanisme"génial" a déjà eu deux bogues ( !). En même temps, il existe une alternative éprouvée - ZeroMemory, qui est également plus rapide (au moins via F5). Le choix est évident

 
A100 #:

Au fait que le mécanisme"magnifique" a déjà eu deux erreurs à la volée ( !).

Ces erreurs n'ont rien à voir avec l'application de combat.

Cependant, il existe une alternative éprouvée, ZeroMemory, qui est également plus rapide (du moins via F5). Le choix est évident

Je pense qu'il n'y a pas de doute sur l'entrée la plus concise et logique des suivantes.

int i = 0;

int j;
j = 0;

Avec les tableaux, c'est similaire.

 
fxsaber #:

Ces erreurs n'ont rien à voir avec l'utilisation en combat.

Je pense qu'il n'y a pas de doute sur l'entrée qui est la plus concise et la plus logique des suivantes.

Il en va de même pour les tableaux.

Voici la troisième erreur (et combien d'autres il y a) en une seule fois ( !):

union X {
    int i;
    double x;
};
void OnStart()
{
    X x[10000] = {}; //(*)
    bool b = true;
    for ( int i = 0; i < ArraySize(x) && (b = (x[i].x == 0.0)); i++ );
    Print( b );
}

Résultat : faux - c'est-à-dire que la mise à zéro ne se produit pas ( !).

Mais avec ZeroMemory

    X x[10000];      //(*)
    ZeroMemory( x ); //(**)

Résultat : vrai - tout va bien - mise à zéro complète

Bien sûr, vous avez le droit de jouer à la loterie et d'utiliser une entrée laconique (une ligne de moins) au lieu d'une entrée évidemment correcte.

 
A100 #:

Et avec ZeroMemory

Résultat : vrai - tout est OK - mise à zéro complète

struct MqlTick2 : private MqlTick {};

void OnStart()
{
  MqlTick2 Ticks[4] = {}; // OK
  
  ZeroMemory(Ticks); // 'Ticks' - not allowed for objects with protected members or inheritance
}