Erreurs, bugs, questions - page 1962

 

question hors sujet mais je vous demande s'il est possible de compléter le manuel MQL5 avec des exemples supplémentaires d'implémentation d'algorithmes plus et plus clairs

 
fxsaber:

Rendre le paramètre d'entrée bool Optim. Dans OnInit, vous renvoyez INIT_FAILED si Optim == true. En même temps, dans OnTesterPass à travers FrameInputs et ParameterGetRange (ou dans le destructeur de l'objet de classe global), vous écrivez en fait le fichier SET Optimisation.

Ensuite, vous mettez Optim = false. Et prenez un autre paramètre sinput int Range, définissez-le par ParameterSetRange pour passer de zéro à un. Lire le fichier SET dans OnTesterInit et définir les valeurs de tous les paramètres du fichier dans ParameterSetRange. Lorsque Range == 0, vous renvoyez INIT_FAILED dans OnInit.

C'est tout ! Au lieu de l'optimisation simple, vous avez l'optimisation imaginaire, qui est également plus rapide que l'optimisation simple..... Plus les paramètres d'entrée en lecture/écriture.

Merci pour l'algorithme détaillé.

 
Temps de compilation en 1643
'TesterBenchmark_Example.mq5'   TesterBenchmark_Example.mq5     1       1
'TesterBenchmark.mqh'   TesterBenchmark.mqh     1       1
0 error(s), 0 warning(s), compile time: 3113 msec               1       1

Temps de compilation à 1648

'TesterBenchmark_Example.mq5'   TesterBenchmark_Example.mq5     1       1
'TesterBenchmark.mqh'   TesterBenchmark.mqh     1       1
0 error(s), 0 warning(s), compile time: 219 msec                1       1

Quelque chose a été modifié !

 

Erreur de compilation

typedef void (*fn)( int );
struct A {
                void f() { return   ; } //(*)
        static  void f( int ) {}
};
void g( fn ) {}
void OnStart()
{
        g( A::f ); //error: 'f' - cannot resolve function address
}

Et si vous remplacez la ligne (*) par

                int  f() { return 0; } //(*)
alors c'est bon. Quelle est la différence ?

Il ressemble àhttps://www.mql5.com/ru/forum/1111/page1977#comment_5595772, mais a un code d'erreur différent


Ошибки, баги, вопросы
Ошибки, баги, вопросы
  • 2017.08.11
  • www.mql5.com
Форум алго-трейдеров MQL5
 

Erreur lors de la compilation

template<typename T>
void g( T ) {}
void f() {}
void OnStart()
{
        g( f ); //error: 'g' - cannot to apply function template
}

Autrement :


template<typename T>
void g( T ) {}
void f() {}
typedef void (*fn)();
void OnStart()
{
        fn ff = f;
        g( ff ); //нормально
}

C'est bon. Quelle différence cela fait-il ?
 
A100:

Erreur lors de la compilation

mais de cette façon :

normalement. Quelle est la différence ?

La différence est énorme. Lorsque g(f) est appelé, le compilateur n'a aucune idée du type de f, car seul le template est prescrit. Si vous surchargez le modèle, il n'y a pas de problème.

typedef void (*fn)();

template<typename T>
void g( T Value ) { Print(typename(Value)); }
void f() {}

void g( fn Value ) { Print(typename(Value)); }
void OnStart()
{
        g( f ); // void(*fn)()
}
 
fxsaber:
Temps de compilation à 1643.

Temps de compilation à 1648


C'est un truc sympa !

Le mien est le même qu'avant, le temps de compilation n'est pas plus rapide !

 
Vitaly Muzichenko:

Je l'ai toujours, la compilation n'est pas accélérée.

Peut-être ne pas utiliser ce qui ralentissait dans TesterBenchmark.mqh

 
fxsaber:

La différence est énorme. Lorsque g(f) est appelé, le compilateur n'a aucune idée du type de f, car seul le modèle est prescrit. Si vous surchargez le modèle, il n'y a pas de problème.

S'il y a une énorme différence, alors pourquoi le C++ compile-t-il bien avec les deux variantes ?
 
A100:
Si la différence est énorme, alors pourquoi les deux variantes compilent-elles normalement en C++ ?

Il n'y a aucune autorité sur le C++ dans ce cas, car j'ai basé mes conclusions sur la logique. Ci-dessus, j'ai retravaillé l'exemple avec une déréférence.

Tout ce que vous avez à faire est de faire une telle substitution

// typedef void (*fn)();
typedef void (*fn123)();

La déréférence sera complètement différente. Vous pouvez demander au compilateur d'être "plus intelligent qu'un idiot" et d'agir comme il le fait en C++. Mais cette solution est vraiment discutable.

C'est-à-dire qu'une telle "aide" peut être implémentée dans le compilateur, mais la différence d'approche est montrée.

Raison: