Questions sur la POO dans MQL5 - page 73

 
Igor Makanu:

En vous abaissant au niveau de communication approprié : ma question concerne-t-elle le sujet du fil de discussion ? Pourquoi êtes-vous venu ici avec vos photos de l'Internet ? Connaissez-vous la réponse ? - Non, assieds-toi et tais-toi ;)

Premièrement, ne me provoquez pas, et deuxièmement, ne réagissez pas si violemment à la vérité.
Je dois être honnête avec vous, j'ai l'impression que vous n'êtes pas très loin de votre interlocuteur aujourd'hui :

Toutes les questions des débutants en MQL4 et MQL5, aide et discussion d'algorithmes et de codes

Igor Makanu, 2020.06.07 13:46

Bonjour à tous. Veuillez m'aider à insérer une variable de type String dans mon code. Merci à

pourriez-vous répondre à votre propre question ?
ou avez-vous découpé un morceau de code quelque part et ne pouvez pas l'utiliser ? et vous devez deviner ce qui se passe au moins))
......
mais je suppose que ce n'est pas la réponse avec cette approche

 

un modérateur notoirement gentil a promis de vous bannir pour avoir provoqué une réponse verbale :-)

à attendre...

 
Certains en savent plus, d'autres moins. Le forum est destiné à la communication et aux questions-réponses.
Il n'y a pas de honte à poser une question pour enrichir ses connaissances. Il est embarrassant de se comporter de manière condescendante envers les personnes qui posent les questions - c'est le niveau d'un étudiant qui est passé au cours suivant et qui diffuse "le savoir sacré du bout des lèvres". Une banalité totale en général...
 
Maxim Kuznetsov:

un modérateur notoirement gentil a promis de vous bannir pour avoir provoqué une réponse verbale :-)

attendez...

Il est difficile de me mettre en colère, et j'ai utilisé tous les jurons de l'armée, il n'y a rien sans eux ;)))

 
Maxim Kuznetsov:

un modérateur notoirement gentil a promis de vous bannir pour avoir provoqué une réponse verbale :-)

à attendre...

Non, Maxim, pas vraiment. Veuillez le relire avec un esprit ouvert.
 
#include <JSON\json.mqh>

JSONObject * getJSONObject(const string json)
{
   JSONValue *jv =((JSONParser *)(new JSONParser())).parse(json);   //1
   if (jv != NULL && jv.isObject()) return((JSONObject *)jv);       //2
   Print(__FUNCSIG__ + "parser error, json = ",json);
   delete jv;                                                       //3
   return(NULL);
}
void OnStart()
{
   JSONObject *jobj = getJSONObject("{\"ObjType\":2,\"m_period\":1}");
   if(jobj!=NULL) Print("m_period = ", jobj.getInt("m_period"));    
   delete jobj;                                                     //3
}


1. pas de suppression pour les objets de typeJSONParser créés via new
casting inutile vers
JSONParser*
Qu'est-ce qui ne va pas avec une variable localeJSONParser? Ou bien vous voulez utiliser un objet temporaire mais vous ne connaissez pas sa signature ?

2. Casting inutile dansJSONObject*
3.
Les variables jv et jobj ne seront certainement pas NULL ? Dans le cas contraire, la suppression d'un pointeur nul dans MQL entraînera l'affichage de "déchets" dans le journal.

 
Sergey Dzyublik:


1. pas de suppression pour les objets de typeJSONParser créés via new
casting inutile vers
JSONParser*
Qu'est-ce qui ne va pas avec une variable localeJSONParser? Ou bien vous voulez utiliser un objet temporaire mais vous ne connaissez pas sa signature ?

2. Casting inutile dansJSONObject*
3.
Les variables jv et jobj ne seront certainement pas NULL ? Dans le cas contraire, la suppression d'un pointeur nul dans MQL entraînera l'affichage de "déchets" dans le journal.

Merci, au moins c'est quelque chose.

cette méthode a été utilisée par l'auteur de la bibliothèque, je ne vois pas l'intérêt d'écrire des appels pour le parsing d'une autre manière


je ne comprends pas la situation de MQL quand on travaille avec des pointeurs - on ne peut pas les déréférencer quand le pointeur devient une entité, et quand c'est un pointeur vers un objet - je ne sais pas quoi faire ((

SZY : J'ai étudié le C++ il y a 20 ans, il n'est pas très utilisé par les ingénieurs de production par la suite, ils se sont d'abord tous assis sur Delphi, puis ont rampé vers Sharp, pour les contrôleurs aussi, je n'ai pas vu de C++, tout fonctionne sur des logicielsspécialisés- c'est probablement le cachet des universités pour les étudiants en ingénierie - ils commencent toujours la formation avec Pascal, même à l'école polytechnique de Volgograd ils lisent turbo-pascal....Qui sait où ils trouvent les compilateurs ))))


ZS : enlevez le refrain, ce n'est pas gentil, c'est généralement l'inverse.

 
Igor Makanu:

Merci, c'est quelque chose.

cette méthode a été utilisée par l'auteur de la bibliothèque, je ne vois pas l'intérêt d'écrire des appels pour le parsing d'une autre manière


je ne comprends pas la situation de MQL quand on travaille avec des pointeurs - on ne peut pas les déréférencer quand le pointeur devient une entité, et quand c'est un pointeur vers un objet - je ne sais pas quoi faire (((

SZY : J'ai étudié le C++ il y a 20 ans, il n'est pas très utilisé pour les ingénieurs de production par la suite, d'abord ils se sont tous assis sur Delphi, puis ils ont rampé vers Sharp, pour les contrôleurs aussi, je n'ai pas vu de C++, tout fonctionne sur des logicielsspécialisés- c'est probablement le cachet des universités pour les étudiants en ingénierie - ils commencent toujours la formation avec Pascal, même à l'école polytechnique de Volgograd ils lisent turbo-pascal....Qui sait où ils trouvent les compilateurs ))))


SZY : enlevez le refrain, ce n'est pas gentil, c'est généralement l'inverse.

Il n'y a pas de pointeurs ici). Il y a un handle pour la classe, oui, travailler avec lui est similaire à travailler avec un pointeur, mais c'est là que le point commun s'arrête.

Maintenant, pour celui qui est surligné :

  • Vous créez un objet soit sur la pile, soit dans le tas.
    CTest test;             //test - object
    CTest* test=new CTest;  //test - handle of object
    Dans le premier cas, le compilateur ajoute un appel implicite au destructeur, qui ne nettoie pas la mémoire ; il renvoie simplement le pointeur de pile à la position précédant l'appel de la fonction. Dans le second cas, lorsqu'on quitte la portée, la mémoire occupée par l'objet reste marquée comme occupée par le gestionnaire de mémoire et comme aucun pointeur ne pointe plus vers elle, elle ne peut pas être libérée (c'est ce qu'on appelle une fuite de mémoire), il faut donc détruire explicitement l'objet par delete.
  • Quant au temps d'exécution local. Ici le handle, s'il n'y a pas de fonction surchargée spécialement pour lui, est déréférencé implicitement, exemple :
    class CTest{
    };
    
    void OnStart()
      {
       CTest test;
       CTest* _test=new CTest;
       Test(test);
       Test(&test);
       Test(_test);
       _Test(_test);
       delete _test;
      }
      
    void Test(CTest &test){Print("Object");}
    void Test(CTest* test){Print("Handle");}
    void _Test(CTest &test) {Print("Ok");}
    PS. Oui, et oublie Sharp, qui n'a rien en commun du tout. ))))
 

Vladimir Simakov:

PS. Oui, et oubliez Sharp, rien en commun))))

Vous ne comprendrez pas, vous êtes habitué aux bonnes choses tout le temps, c'est logique, si vous vous trompez - VS vous le dira tout de suite, et quand le code est exécuté - vous laissez le corps de la fonction - oubliez-le, vous assignez simplement NULL au code créé et il supprime le désordre par lui-même ;))

Merci, je vais y réfléchir

 
Igor Makanu:

Cela ne marchera pas, on s'habitue très vite à une bonne chose, c'est tout à fait logique, si vous vous trompez quelque part - VS vous le dira tout de suite, et dans l'exécution du code, vous laissez le corps de la fonction - vous oubliez, tout au plus vous avez créé NULL - il s'effacera de lui-même ;))

Merci, je vais y réfléchir

Oui, une seule triste référence implicite à un objet (par exemple, un appel de méthode dans la feuille invoke d'un délégué) vit dans le fourré du code et la mémoire a disparu. On ne peut pas non plus le gâcher avec Sharp.

Raison: