Erreurs, bugs, questions - page 2206

 
Denis Sartakov:

J'ai récemment écrit une fonction de ce type, alors essayez de la comprendre par vous-même,

Si ça ne marche pas, je t'expliquerai.

merci

 

une autre question :

la description deCHART_IS_MAXIMIZED etCHART_IS_MINIMIZED ne dit pas que ces propriétés sont en lecture seule, mais ChartSetInteger(ChartID(),CHART_IS_MAXIMIZED,true) ; ne fonctionne pas, quel pourrait être le problème ???

 

Pourquoi ne compile-t-il pas ?

template <typename T>
void f(T &t)
{
   t.f();
}

void OnStart()
{
   class Q
   {
   public:
      void f() {}
   }q;
   
   f(q);
}

Les anciennes versions du compilateur a mangé de telles constructions bien, a pris de recompiler le code antérieur valide et l'erreur. Est-ce un accident ou s'est-il détaché intentionnellement ?

 
pavlick_:

Pourquoi ne compile-t-il pas ?

Les anciennes versions du compilateur fonctionnaient bien avec de telles constructions, j'ai recompilé du code précédemment valide et il y a une erreur. Est-ce un accident ou s'est-il détaché intentionnellement ?

mais peut-on créer des classes à l'intérieur de fonctions selon la spécification du langage ?

 
Konstantin:

mais peut-on créer des classes à l'intérieur des fonctions selon la spécification du langage ?

Quelle spécification de langage ? Mcl n'est pas du tout bien documenté, alors qu'en c++ c'est une pratique normale, d'après la référence :

Classes locales

Une déclaration de classe peut apparaître dans l'espace de nom (auquel cas elle définit une classe ordinaire), à l'intérieur d'une autre définition de classe (auquel cas elle définit une classe imbriquée), et à l'intérieur du corps d'une fonction, auquel cas elle définit une classe locale. Le nom d'une telle classe n'existe que dans la portée de la fonction, et n'est pas accessible en dehors.

http://en.cppreference.com/w/cpp/language/class

 

La réponse est le silence, comme d'habitude. En fait, il est facile de contourner le problème - au lieu d'un placement élégant à l'intérieur de la fonction, je le place à l'extérieur avec un nom intimidant internal__Chart_bar_shift_Comp. Mais le truc c'est que - ils ont juste coupé une telle construction. C'est-à-dire qu'il n'y a aucune garantie que mon code sera compilé demain. Vous pouvez en quelque sorte utiliser des clés pour sélectionner le dialecte -std=mql18, par exemple. Mais non, je ne me soucie pas de la rétrocompatibilité. J'ai du mal à imaginer que cela soit possible sur certains gcc.

Je suppose qu'un simple script mql4 était tout à fait suffisant pour une plateforme de trading. Ou mieux encore, importer des plugins (dans des bibliothèques dynamiques) avec des scripts/experts. Mais non, vous avez besoin de votre propre, comme on dit souvent ici, "infrastructure" où vous êtes grand et important.

 
pavlick_:

Selon quelle spécification linguistique ? Mcl n'est pas du tout bien documenté, mais en c++ c'est une pratique normale, issue du livre de référence :

Classes locales

Une déclaration de classe peut apparaître dans l'espace de nom (auquel cas elle définit une classe ordinaire), à l'intérieur d'une autre définition de classe (auquel cas elle définit une classe imbriquée), et à l'intérieur du corps d'une fonction, auquel cas elle définit une classe locale. Le nom d'une telle classe n'existe que dans la portée de la fonction, et n'est pas accessible en dehors.

http://en.cppreference.com/w/cpp/language/class

j'ai rencontré une discussion quelque part que ce n'est pas prévu dans la spécification mql5, vérifiez sur le forum, il y avait aussi une discussion sur les lambas, qu'ils ne sont pas prévus.

 
pavlick_:

La réponse est le silence, comme d'habitude. En fait, il est facile de contourner le problème - au lieu d'un placement élégant à l'intérieur de la fonction, je le place à l'extérieur avec un nom intimidant internal__Chart_bar_shift_Comp. Mais le point est différent - ils viennent de couper une telle construction. C'est-à-dire qu'il n'y a aucune garantie que mon code sera compilé demain. Vous pouvez en quelque sorte utiliser des clés pour sélectionner le dialecte -std=mql18, par exemple. Mais non, je ne me soucie pas de la rétrocompatibilité. Je peux difficilement imaginer que c'est possible dans certains gcc.

Probablement, un simple script mql4 était tout à fait suffisant pour une plateforme de trading. Ou mieux - importer des plugins (dans des bibliothèques dynamiques) avec des scripts/experts. Mais non, vous avez besoin de votre propre, comme on dit souvent ici, "infrastructure", où vous êtes grand et important.

Pour être honnête, je ne comprends pas pourquoi ils font cela. Il est plus facile de mettre toutes les entités auxiliaires dans un listing séparé du code source, par exemple util.mqh

 
Konstantin:

Pour être honnête, je ne comprends pas pourquoi, il est plus facile de mettre toutes les entités auxiliaires dans un listing séparé du code source, par exemple util.mqh

Il s'agit d'un prédicat pour la recherche binaire, qui n'est pas universel et n'est utilisé qu'une seule fois dans une fonction, pourquoi devrais-je le mettre quelque part ? Par exemple, nous avons un tableau de structures (sans opérateur de comparaison, elles ne peuvent pas être comparées maladroitement avec <, ou la condition de comparaison est très délicate), et nous voulons trouver un élément par une recherche binaire. Dans la bibliothèque plus, les fonctions algorithmiques prennent un foncteur (passé commodément comme un lambda), à l'intérieur duquel nous comparons les éléments du tableau. Une solution très élégante à mon avis.

int main()
{
    typedef pair<int, double> myPair; // typedef to shorten the type name
    vector <myPair> vec(5);

    myPair low_val; // reference value (set this up as you want)
    auto it = lower_bound(vec.begin(), vec.end(), low_val, 
        [](myPair lhs, myPair rhs) -> bool { return lhs.second < rhs.second; });
}

Mais en raison des limitations de µl, nous avons créé une instance de la classe prédicat.

 
pavlick_:

Il s'agit d'un prédicat pour la recherche binaire, qui n'est pas universel et n'est utilisé qu'une seule fois dans une fonction, pourquoi devrais-je le mettre quelque part ? Par exemple, nous avons un tableau de structures (pas d'opérateur de comparaison, on ne peut pas les comparer maladroitement avec <, ou la condition de comparaison est très délicate), et nous voulons trouver un élément par une recherche binaire. Dans la bibliothèque plus, les fonctions algorithmiques prennent un foncteur (passé commodément comme un lambda), à l'intérieur duquel nous comparons les éléments du tableau. Une solution très élégante à mon avis.

Mais en raison des limitations de mcl, j'ai créé une instance de la classe prédicat.

Au fait, il est intéressant de voir comment ce code sera optimal à la compilation ;))