L'avenir de MQL5 est MQL5+ ou même MQL6 - page 11

 
Alexey Kozitsyn:

Tu as tout compris. Utiliser une constante NULL.

Laissez-moi vous dire un secret, c'est déjà mis en œuvre. Vous devez cliquer sur la roue de la souris et il y aura un réticule.

Vous pouvez le faire il y a longtemps. Depuis le navigateur, vous faites glisser l'indicateur vers la fenêtre à laquelle il est déjà attaché.

À mon avis, ce n'est pas la chose la plus nécessaire.

Vous avez un navigateur, vous avez des favoris, vous avez des modèles, vous avez des profils. Tout peut être mis en place. Lisez l'aide pour le terminal, vous y découvrirez beaucoup de choses !

Les énumérations sont utilisées pour rendre le code plus lisible, pour supprimer les constantes et les remplacer par des entités connues de l'homme.

Par exemple, les valeurs de l'énumération ENUM_DAY_OF_WEEK peuvent être utilisées pour la comparaison avec la valeur day_of_week de la structure MqlDateTime. Par exemple, vous pouvez l'écrire comme suit

Ou vous pouvez l'écrire différemment :

DIMANCHE est une constante nommée de type int avec la valeur 0.

Que pensez-vous, comment cela sera-t-il plus clair pour une personne lisant le code ?

Cool ! Merci pour le navigateur ! Je n'y ai pas prêté beaucoup d'attention. J'ai l'habitude de le désactiver, pour qu'il ne prenne pas trop de place. L'aide, même si c'est juste un aperçu, je l'ai lu. Il ne me dit rien sur le fait de faire glisser un indirect dans la fenêtre des graphiques et les uns sur les autres. Bien que, j'aurais pu le deviner et essayer....))).

Merci d'avoir expliqué la nature des énumérations ! Je les ai lus très rapidement, MQL est principalement dérivé de C++, et il y a beaucoup de docks pour lui. Mais un grand nombre de fautes d'impression dans l'aide et des articles incomplets ne sont pas bons.

Résultats : une aide correctement rédigée peut permettre d'éviter beaucoup de questions stupides de la part des nuls sur le forum !

En ce qui concerne NULL, c'est zéro - on l'utilise beaucoup. Mais les valeurs maximales des variables sont très rares, presque jamais. Par exemple, une variable stocke trois états après l'analyse des indicateurs : BUY, SELL ou NULL. Si nous utilisons les constantes toutes faites POSITION_TYPE_BUY, POSITION_TYPE_SELL, l'une d'entre elles est zéro. Je suis sûr que EMPTY_VALUE sera plus populaire que NULL si vous le généralisez à tous les types).

 
Alexander Puzanov:

Il existe une autre application infiniment utile. Par exemple :

Et l'utilisateur obtient une liste déroulante avec un choix de 4 éléments de ce que vous avez écrit là dans les commentaires - "Acheter seulement", "Vendre seulement", etc. Très utile pour répertorier un ensemble d'indicateurs, de délais, un ensemble de conditions, etc. dans la fenêtre des paramètres utilisateur.

Oui, bien sûr ! Dans ce cas, nous pouvons également ajouter qu'il simplifie le mécanisme de vérification par le programme des valeurs saisies par l'utilisateur. C'est-à-dire qu'elles sont toutes (valeurs correctes) décrites initialement.
 
agvozdezkiy:

La partie NULL est zéro, et elle est souvent utilisée. Par exemple, la variable stocke trois états après l'analyse des indicateurs : BUY, SELL ou NULL. Si nous utilisons les constantes prêtes à l'emploi POSITION_TYPE_BUY, POSITION_TYPE_SELL, l'une d'entre elles est NULL.

Pas de problème, vous pouvez le faire de cette façon :

#define  VALUE_EMPTY -1       // Пустое значение для числовых типов данных
#define  STR_VALUE_EMPTY ""   // Пустое значение для строкового типа

Et mettez-le où vous voulez.

 
Alexey Kozitsyn:

Pas de problème, vous pouvez le faire de cette façon :

Et mettez-le où vous voulez.

C'est tout à fait compréhensible. Ce n'est pas ce que je veux dire.
 
agvozdezkiy:
Tout ceci est clair. Ce n'est pas ce que je veux dire.

Alors, expliquez ce que vous voulez dire ? Une seule constante pour tous les types de données prédéfinis ? Il est peu probable qu'une telle chose soit mise en œuvre.

 
Renat Fatkhullin:

Malheureusement, seuls les programmeurs expérimentés comprennent l'utilité et l'importance d'un tel avertissement.

Eh bien, je recommande à tous les autres d'être heureux de ce niveau d'aide du compilateur et de corriger leurs propres erreurs. Ce sont de véritables lieux d'erreurs potentielles et c'est précisément pour les développeurs novices qu'il est essentiel d'apprendre.

Pouvez-vous faire l'espace de nom ? Le problème serait alors également résolu.
 

Le sujet des "méthodes purement virtuelles" a déjà été abordé sur le forum il y a quelques années.

C'est-à-dire que dans le concept C++, les méthodes virtuelles sans corps qui doivent OBLIGATOIREMENT être surchargées dans les descendants :

virtual void Func1() = 0;

En outre, une classe contenant de telles méthodes devient automatiquement abstraite. Le compilateur en tient compte également. (En fait, c'est juste pour respecter les normes, bien que vous puissiez cacher le constructeur dans une portée protégée).

Il nous manque actuellement beaucoup de comportements de "méthodes virtuelles pures". Sans cette fonctionnalité, vous ne pouvez pas préparer correctement une bibliothèque ou un framework pour l'externaliser : vous créez votre classe enfant (qui n'est pas là pour rien, mais qui est intégrée comme un rouage dans d'autres classes) et vous avez la gentillesse d'implémenter toute l'interface. Maintenant, vous héritez, vous ne mettez pas d'implémentation de méthode, le compilateur l'avale, rien ne fonctionne. Fouiller dans le code source de la classe mère ?

Le concept d'interface est l'un des fondements de la POO. Par conséquent, j'aimerais vraiment voir l'implémentation d'une telle chose dans 5, et non dans MQL6.

D'ailleurs, dans la documentation sur les fonctions virtuelles, il y a une erreur

Виртуальная функция, как и обычная функция, должна иметь исполняемое тело. При вызове семантика ее точно такая же, как и у остальных функций.

Exemple :

class Base {
private:
        int a;
public:
        virtual int Func1();
};


class Second: public Base {
public:
        int Func2() {
                return 0;
        };      
};

int OnInit() {

        Base* base = new Base();
        Second* foo = new Second();
   return(INIT_SUCCEEDED);
}

La fonction virtuelleFunc1 n'a pas de corps exécutable (et ne renvoie même pas de valeur), mais se compile sans erreur.

 
Igor Volodin:

Le sujet des "méthodes purement virtuelles" a déjà été abordé sur le forum il y a quelques années.

C'est-à-dire que dans le concept C++, les méthodes virtuelles sans corps, qui doivent OBLIGATOIREMENT être surchargées dans les descendants :

En outre, une classe contenant de telles méthodes devient automatiquement abstraite. Le compilateur en tient compte également. (En fait, c'est juste pour respecter les normes, bien que vous puissiez cacher le constructeur dans une portée protégée).

Il nous manque actuellement beaucoup de comportements de "méthodes virtuelles pures". Sans une telle fonctionnalité, vous ne pouvez pas préparer correctement une bibliothèque ou un framework pour l'externaliser : vous créez votre propre classe enfant (qui ne sert pas à rien, mais est intégrée comme un rouage dans d'autres classes) et vous avez la gentillesse d'implémenter toute l'interface. Maintenant, vous héritez, vous ne mettez pas d'implémentation de méthode, le compilateur l'avale, rien ne fonctionne. Fouiller dans le code source de la classe mère ?

Le concept d'interface est l'un des fondements de la POO. Par conséquent, j'aimerais vraiment voir l'implémentation d'une telle chose dans 5, et non dans MQL6.

D'ailleurs, dans la documentation sur les fonctions virtuelles, il y a une erreur

Exemple :

La fonction virtuelleFunc1 n'a pas de corps exécutable (et ne renvoie même pas de valeur), mais se compile sans erreur.

1. Des fonctions virtuelles pures seront bientôt ajoutées

2. où se trouve l'appel Func1 dans votre exemple ? Pas d'appel - pas de contrôle du corps.

 
Slawa:

1. Des fonctions virtuelles pures seront bientôt ajoutées

2. où se trouve l'appel Func1 dans votre exemple ? Pas d'appel - pas de contrôle du corps non plus.

VS 2015 a déclaré ce qui suit

Gravité Code Description Projet Fichier Ligne État de suppression

Erreur LNK2001 Symbole externe non résolu "public : virtual int __thiscall Base::Func1(void)" (?Func1@Base@UAEHXZ) TestCPPCode C:\MyP\AvForex\trunk\TestCPPCode.obj 1

Erreur LNK1120 1 externalités non résolues TestCPPCode C:\MyP\AvForex\trunk\MQL4FilesForFormatting2015\Debug\TestCPPCode.exe 1

 
Alexey Volchanskiy:

VS 2015 a déclaré ce qui suit

Gravité Code Description Projet Fichier Ligne État de suppression

Erreur LNK2001 Symbole externe non résolu "public : virtual int __thiscall Base::Func1(void)" (?Func1@Base@UAEHXZ) TestCPPCode C:\MyP\AvForex\trunk\TestCPPCode.obj 1

Erreur LNK1120 1 externalités non résolues TestCPPCode C:\MyP\AvForex\trunk\MQL4FilesForFormatting2015\Debug\TestCPPCode.exe 1

Afficher le code source