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

 
Les commentaires non liés à ce sujet ont été déplacés vers "Questions des débutants de MQL5 MT5 MetaTrader 5".
 

Les fonctions standard reçoivent les arguments de gauche à droite.

Les fonctions personnalisées reçoivent les arguments de droite à gauche.

double f1()
{
  Print(__FUNCSIG__);
  
  return(0);
}

double f2()
{
  Print(__FUNCSIG__);
  
  return(0);
}

void Func( double, double )
{
}

#define  PRINT(A) Print(#A);  A

void OnStart()
{  
  PRINT(MathMin(f1(), f2()));
  
  PRINT(Func(f1(), f2()));
}


Résultat.

        MathMin(f1(),f2())
        double f1()
        double f2()
        Func(f1(),f2())
        double f2()
        double f1()


Est-ce que c'est comme ça que ça doit être ?

 
fxsaber:

C'est comme ça que ça doit être ?

Il s'agit d'un BPU auquel on ne peut pas se fier. C'est-à-dire qu'il faut explicitement éviter les situations où la logique d'un programme dépend de l'ordre dans lequel les arguments sont évalués.

 
fxsaber:

Les fonctions régulières reçoivent les arguments de gauche à droite.

Voici un exemple de réfutation :

string f1() { Print(1); return NULL; }
string f2() { Print(2); return NULL; }
void OnStart()
{
    StringCompare(f1(), f2());
}

Résultat : 2 1

 
Andrei Trukhanovich:

Il s'agit d'un BPU auquel on ne peut pas se fier. C'est-à-dire que nous devons explicitement éviter les situations où la logique d'un programme dépend de l'ordre dans lequel les arguments sont évalués.

A100:

Voici un exemple de réfutation :

Il s'avère que tout est instable avec les personnalisés. Avec les personnalisés, tout est instable dès le départ.

 
fxsaber:

Il s'avère que tout est instable avec les standards. Avec les modèles personnalisés, c'est sans ambiguïté dès le départ.

La différence est qu'il existe des fonctions régulières (de droite à gauche) et des fonctions en ligne (ordre indéfini).

les fonctions inline ne sont pas des fonctions du tout, c'est-à-dire qu'elles ne peuvent pas avoir d'adresse. De ce point de vue, il n'y a pas de différence entre les fonctions ordinaires et les fonctions personnalisées. Par exemple, on ne comprend pas pourquoi les arguments de la fonction personnalisée la plus simple (qui est par essence inline) sont toujours calculés de droite à gauche. Je n'exclus pas qu'à l'avenir pour les fonctions en ligne l'ordre puisse changer, donc

J'ai suggéré à un moment donné d'introduire un mot-clé en ligne pour une utilisation sûre de l'ordre des calculs :

Forum sur le trading, les systèmes de trading automatisé et les tests de stratégies de trading

Erreurs, bugs, questions

A100, 2017.10.05 14:30

Cela démontre une fois de plus l'utilité du mot-clé C++ inline (il y avait ici une opinion selon laquelle il était soi-disant obsolète).
Entre autres choses, inline signifie en fait que le programmeur n'utilise pas l'ordre de calcul des paramètres de la fonction et si le compilateur décide de rendre la fonction inline, alors le compilateur peut utiliser l'ordre de calcul avant comme plus efficace (l'ordre de calcul inverse n'est évidemment efficace que pour les fonctions appelées).
En même temps, si le compilateur décide d'intégrer une fonction non inline, il doit utiliser l'ordre d'évaluation inverse (général), même si cela entraîne une perte d'efficacité (parce que le programmeur a supposé cet ordre sans avoir déclaré la fonction inline).

inline serait également approprié en MQL, où l'ordre de calcul ne peut pas être contrôlé explicitement


 
A100:

La différence est qu'il existe des fonctions normales (de droite à gauche) et des fonctions en ligne (ordre indéfini).

Les fonctions en ligne ne sont pas des fonctions du tout, c'est-à-dire qu'elles ne peuvent pas avoir d'adresse. De ce point de vue, il n'y a pas de différence entre les fonctions ordinaires et les fonctions personnalisées. Par exemple, on ne comprend pas pourquoi les arguments de la fonction personnalisée la plus simple (qui est par essence inline) sont toujours calculés de droite à gauche. Je n'exclus pas qu'à l'avenir pour les fonctions en ligne l'ordre puisse changer, donc

J'ai suggéré à un moment donné d'introduire le mot clé inline pour une utilisation sûre de l'ordre de calcul :

Merci pour la précision, je n'avais pas pensé à l'inline.

__forceinline void Func( double, double )

Cette option n'a aucun effet sur le résultat.

 
fxsaber:

Merci pour la précision, je n'avais pas pensé à l'inline.

Cette option n'affecte pas le résultat.

Elle n'a aucun effet maintenant, car elle n'existe pas dans MQL

#define inline

et à l'avenir, il peut avoir un sens réel, sinon pourquoi l'introduire ?

 
A100:

Il n'a pas d'effet maintenant, parce que dans MQL il est en quelque sorte absent maintenant.

et à l'avenir, il peut avoir un sens réel, sinon pourquoi l'avoir introduit ?

Pour autant que je me souvienne de l'aide de la version, il a été introduit comme un stub pour permettre de mettre en ligne les fichiers *.h.

 
Quant à l'ordre d'appel des fonctions dont les retours sont passés comme arguments à une fonction, la norme c++ n'impose pas d'exigences au compilateur sur l'ordre de leur calcul, elles peuvent être appelées dans n'importe quel ordre(https://en.cppreference.com/w/cpp/language/eval_order). La façon dont l'analogie est applicable à mql dépend des développeurs, qui peuvent ou non avoir pris la peine de la définir.
Raison: