Fragen zu OOP in MQL5 - Seite 73

 
Igor Makanu:

Um sich auf die angemessene Kommunikationsebene herabzulassen: Gehört meine Frage zum Thema des Threads? Warum sind Sie mit Ihren Bildern aus dem Internet hierher gekommen? Kennen Sie die Antwort? - Nein, setz dich und sei still ;)

Erstens, stoßen Sie mich nicht, und zweitens, reagieren Sie nicht so heftig auf die Wahrheit.
Ich muss Ihnen ehrlich sagen, dass ich den Eindruck habe, dass Sie nicht sehr weit von Ihrem heutigen Gesprächspartner entfernt sind:

Alle Fragen von Anfängern in MQL4 und MQL5, Hilfe und Diskussion von Algorithmen und Codes

Igor Makanu, 2020.06.07 13:46

Hallo zusammen. Bitte helfen Sie mir, eine String-Variable in meinen Code einzufügen. Dank an

Könntest du deine eigene Frage beantworten?
oder hast du irgendwo ein Stück Code ausgeschnitten und kannst es nicht verwenden? und du musst zumindest raten, was los ist))
......
aber ich schätze, das ist nicht die Antwort mit diesem Ansatz

 

ein notorisch freundlicher Moderator hat versprochen, Sie zu sperren, wenn Sie eine verbale Antwort provozieren :-)

Warten...

 
Manche wissen mehr, manche weniger. Das Forum dient der Kommunikation und Fragen und Antworten.
Es ist keine Schande, eine Frage zu stellen, um das Wissen zu erweitern. Es ist peinlich, sich den Fragenden gegenüber herablassend zu verhalten - das ist das Niveau eines Studenten, der zum nächsten Kurs übergegangen ist und "heiliges Wissen über die Lippen" verbreitet. Eine totale Verrücktheit im Allgemeinen...
 
Maxim Kuznetsov:

ein gewisser notorisch guter Moderator hat versprochen, Sie zu sperren, wenn Sie eine verbale Reaktion provozieren :-)

Warten Sie es ab...

Es ist schwierig, mich wütend zu machen, und ich habe alle Schimpfwörter in der Armee verwendet, es gibt nichts ohne sie )))

 
Maxim Kuznetsov:

ein notorisch freundlicher Moderator hat versprochen, Sie zu sperren, wenn Sie eine verbale Antwort provozieren :-)

Warten...

Nein, Maxim, so nicht. Bitte lesen Sie ihn noch einmal unvoreingenommen.
 
#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. kein Löschen von Objekten des TypsJSONParser, die mit new erstellt wurden
sinnloses Casting auf
JSONParser*
Was ist falsch an einer lokalenJSONParser-Variable? Oder möchten Sie ein temporäres Objekt verwenden, kennen aber dessen Signatur nicht?

2. Sinnloses Casting inJSONObject*
3
. Die Variablen jv und jobj werden definitiv nicht NULL sein? Andernfalls wird beim Entfernen eines Null-Zeigers in MQL "Müll" in das Protokoll geschrieben.

 
Sergey Dzyublik:


1. kein Löschen von Objekten des TypsJSONParser, die mit new erstellt wurden
sinnloses Casting auf
JSONParser*
Was ist falsch an einer lokalenJSONParser-Variable? Oder möchten Sie ein temporäres Objekt verwenden, kennen aber dessen Signatur nicht?

2. Sinnloses Casting inJSONObject*
3
. Die Variablen jv und jobj werden definitiv nicht NULL sein? Andernfalls wird beim Entfernen eines Null-Zeigers in MQL "Müll" in das Protokoll geschrieben.

Danke, das ist doch schon mal etwas.

diese Methode wurde vom Autor der Bibliothek verwendet, ich sehe keinen Sinn darin, Aufrufe zum Parsen auf eine andere Art zu schreiben


Ich verstehe nicht die Situation mit MQL bei der Arbeit mit Zeigern - Sie können nicht dereference sie, wenn der Zeiger eine Entität wird, und wenn es ein Zeiger auf ein Objekt ist - ich weiß nicht, was zu tun ist ((

SZY: Ich habe vor 20 Jahren C++ studiert, später wird es von Wirtschaftsingenieuren nicht mehr so häufig verwendet. Zuerst benutzen sie alle Delphi, dann Sharp, für Steuerungen habe ich C++ nicht gesehen, alles arbeitet mitspezialisierter Software - das ist wahrscheinlich der Stempel der Universitäten für Ingenieurstudenten - sie beginnen die Ausbildung immer mit Pascal, sogar am Wolgograder Polytechnikum lesen sie Turbo-Pascal....Wer weiß, woher sie die Compiler bekommen ))))


ZS: Nimm den Refrain raus, das ist nicht schön, das ist meistens umgekehrt.

 
Igor Makanu:

Danke, das ist doch schon mal was.

diese Methode wurde vom Autor der Bibliothek verwendet, ich sehe keinen Sinn darin, Aufrufe zum Parsen auf eine andere Art zu schreiben


Ich verstehe nicht die Situation mit MQL bei der Arbeit mit Zeigern - Sie können nicht dereference sie, wenn der Zeiger eine Entität wird, und wenn es ein Zeiger auf ein Objekt ist - ich weiß nicht, was zu tun ist (((

SZY: Ich habe vor 20 Jahren C++ studiert, später wird es von Wirtschaftsingenieuren nicht mehr so häufig verwendet. Zuerst benutzen sie alle Delphi, dann Sharp, für Steuerungen habe ich C++ nicht gesehen, alles arbeitet mitspezialisierter Software - das ist wahrscheinlich der Stempel der Universitäten für Ingenieurstudenten - sie beginnen die Ausbildung immer mit Pascal, sogar am Wolgograder Polytechnikum lesen sie Turbo-Pascal....Wer weiß, woher sie die Compiler bekommen ))))


SZY: Entfernen Sie den Refrain, das ist nicht schön, normalerweise ist es umgekehrt.

Es gibt keine Zeiger hier) Es ist ein Handle für die Klasse, ja, die Arbeit mit ihm ist ähnlich wie die Arbeit mit einem Zeiger, aber das ist, wo die gemeinsame Sache endet.

Nun zu dem hervorgehobenen Punkt:

  • Sie erstellen ein Objekt entweder auf dem Stack oder auf dem Heap.
    CTest test;             //test - object
    CTest* test=new CTest;  //test - handle of object
    Im ersten Fall fügt der Compiler einen impliziten Destruktoraufruf hinzu, der keinen Speicher aufräumt, sondern nur den Stapelzeiger an die Position vor dem Funktionsaufruf zurückbringt. Im zweiten Fall, beim Verlassen des Geltungsbereichs, bleibt der vom Objekt belegte Speicher vom Speichermanager als belegt markiert, und da kein Zeiger mehr auf ihn zeigt, kann er nicht freigegeben werden (dies wird als Speicherleck bezeichnet), so dass wir das Objekt explizit durch Löschen zerstören müssen.
  • Was die lokale Laufzeit betrifft. Hier wird Handle, wenn es keine überladene Funktion speziell dafür gibt, implizit dereferenziert, Beispiel:
    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. Ja, und vergiss Sharp, das hat nichts gemeinsam))))
 

Vladimir Simakov:

PS. Ja, und vergiss Sharp, nichts Gemeinsames)))

Sie werden es nicht bekommen, Sie gewöhnen sich an das gute Zeug die ganze Zeit, es ist logisch, wenn Sie durcheinander - VS wird Ihnen sofort sagen, und wenn der Code ausgeführt wird - Sie verlassen die Funktion Körper - einfach vergessen, Sie weisen Sie einfach NULL auf den erstellten Code und es entfernt das Chaos von selbst ))

Danke, ich werde darüber nachdenken.

 
Igor Makanu:

Es wird nicht funktionieren, Sie gewöhnen sich an eine gute Sache sehr schnell, es ist alles logisch, wenn Sie irgendwo vermasseln - VS wird Ihnen sofort sagen, und in Code-Ausführung verlassen Sie den Funktionskörper - Sie einfach vergessen, höchstens haben Sie NULL erstellt - es wird es von selbst bereinigen ))

Danke, ich werde darüber nachdenken.

Ja, nur ein trauriger impliziter Objektverweis (z.B. Methodenaufruf im invoke-Blatt eines Delegaten) hat im Code-Dickicht überlebt und der Speicher ist weg. In Sharp kann man es auch nicht vermasseln.