Domande su OOP in MQL5 - pagina 73

 
Igor Makanu:

Abbassandoti al livello di comunicazione appropriato: la mia domanda è sull'argomento del thread? Perché sei venuto qui con le tue foto da Internet? Conosci la risposta? - No, siediti e stai zitto ;)

In primo luogo, non punzecchiarmi, e in secondo luogo, non reagire così violentemente alla verità.
Devo essere onesto con lei, ho l'impressione che lei oggi non sia molto lontano dal suo interlocutore:

Tutte le domande dei principianti in MQL4 e MQL5, aiuto e discussione di algoritmi e codici

Igor Makanu, 2020.06.07 13:46

Ciao a tutti. Per favore aiutatemi a inserire una variabile String nel mio codice. Grazie a

Potresti rispondere alla tua stessa domanda?
o hai tagliato un pezzo di codice da qualche parte e non puoi usarlo? e devi almeno indovinare cosa sta succedendo))
......
ma credo che non sia la risposta con questo approccio

 

un moderatore notoriamente gentile ha promesso di bannarti per aver provocato una risposta verbale :-)

aspettando...

 
Alcuni ne sanno di più, altri di meno. Il forum è per la comunicazione e le domande e risposte.
Non c'è vergogna nel fare una domanda per arricchire la conoscenza. È imbarazzante comportarsi in modo accondiscendente nei confronti degli interroganti - questo è il livello di uno studente che è passato al corso successivo e sta trasmettendo "la sacra conoscenza attraverso il labiale". Una zanyness totale in generale...
 
Maxim Kuznetsov:

un moderatore notoriamente gentile ha promesso di bannarti per aver provocato una risposta verbale :-)

aspettate...

È difficile farmi arrabbiare, e ho usato tutte le parolacce dell'esercito, non c'è niente senza di loro )))

 
Maxim Kuznetsov:

un moderatore notoriamente gentile ha promesso di bannarti per aver provocato una risposta verbale :-)

in attesa...

No, Maxim, non è così. Per favore, rileggetelo con una mente aperta.
 
#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. nessuna cancellazione per l'oggetto di tipoJSONParser creato tramite new
casting senza senso a
JSONParser*
Cosa c'è di sbagliato in una variabile localeJSONParser? O volete usare un oggetto temporaneo ma non conoscete la sua firma?

2. Casting inutile inJSONObject*
3
. Le variabili jv e jobj non saranno sicuramente NULL? Altrimenti la rimozione di un puntatore nullo in MQL stamperà "spazzatura" nel registro.

 
Sergey Dzyublik:


1. nessuna cancellazione per l'oggetto di tipoJSONParser creato tramite new
casting senza senso a
JSONParser*
Cosa c'è di sbagliato in una variabile localeJSONParser? O volete usare un oggetto temporaneo ma non conoscete la sua firma?

2. Casting inutile inJSONObject*
3
. Le variabili jv e jobj non saranno sicuramente NULL? Altrimenti la rimozione di un puntatore nullo in MQL stamperà "spazzatura" nel registro.

Grazie, almeno è qualcosa.

questo metodo è stato usato dall'autore della libreria, non vedo il punto di scrivere le chiamate per il parsing in un altro modo


Non capisco la situazione con MQL quando si lavora con i puntatori - non si può dereferenziare quando il puntatore diventa un'entità, e quando è un puntatore a un oggetto - non so cosa fare ((

SZY: Ho studiato C++ 20 anni fa, non è molto usato per gli ingegneri di produzione dopo, prima si sono seduti tutti su Delphi, poi hanno strisciato su Sharp, anche per i controllori, non ho visto C++, tutto funziona su softwarespecializzato- probabilmente è il timbro delle università per gli studenti di ingegneria - iniziano sempre la formazione con Pascal, anche al Politecnico di Volgograd leggono turbo-pascal....Chissà dove prendono i compilatori ))))


ZS: togliere il coro, non è bello, di solito è il contrario.

 
Igor Makanu:

Grazie, è qualcosa.

questo metodo è stato usato dall'autore della libreria, non vedo il punto di scrivere le chiamate per il parsing in un altro modo


Non capisco la situazione con MQL quando si lavora con i puntatori - non si può dereferenziare quando il puntatore diventa un'entità, e quando è un puntatore a un oggetto - non so cosa fare (((

SZY: Ho studiato C++ 20 anni fa, non è molto usato per gli ingegneri di produzione dopo, prima si sono seduti tutti su Delphi, poi hanno strisciato su Sharp, anche per i controllori, non ho visto C++, tutto funziona su softwarespecializzato- probabilmente è il timbro delle università per gli studenti di ingegneria - iniziano sempre la formazione con Pascal, anche al Politecnico di Volgograd leggono turbo-pascal....Chissà dove prendono i compilatori ))))


SZY: togliere il coro, non è bello, di solito è il contrario.

Non ci sono puntatori qui) C'è un handle per la classe, sì, lavorare con esso è simile a lavorare con un puntatore, ma qui finisce la cosa comune.

Ora per quello evidenziato:

  • Si crea un oggetto sullo stack o nell'heap.
    CTest test;             //test - object
    CTest* test=new CTest;  //test - handle of object
    Nel primo caso, il compilatore aggiunge una chiamata implicita al distruttore, che non pulisce alcuna memoria; semplicemente restituisce il puntatore dello stack alla posizione prima che la funzione venga chiamata. Nel secondo caso, quando si lascia lo scope, la memoria occupata dall'oggetto rimane segnata come occupata dal gestore di memoria e poiché nessun puntatore punta più ad essa, non può essere liberata (questo è chiamato un memory leak), quindi dobbiamo distruggere esplicitamente l'oggetto tramite delete.
  • Per quanto riguarda il tempo di esecuzione locale. Qui l'handle, se non c'è una funzione overloaded appositamente per esso, è implicitamente dereferenziato, esempio:
    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. Sì, e dimenticatevi di Sharp, niente in comune a tutti))))
 

Vladimir Simakov:

PS. Sì, e dimenticati di Sharp, niente in comune)))

Non lo capirai, ti abitui sempre alla roba buona, è logico, se fai un casino - VS te lo dirà subito, e quando il codice viene eseguito - lasci il corpo della funzione - dimenticalo, basta assegnare NULL al codice creato e rimuove il casino da solo ))

Grazie, ci penserò

 
Igor Makanu:

Non funzionerà, ci si abitua molto rapidamente a una cosa buona, è tutto logico, se sbagliate da qualche parte - VS ve lo dirà subito, e nell'esecuzione del codice lasciate il corpo della funzione - semplicemente dimenticate, al massimo avete creato NULL - lo cancellerà da solo ))

Grazie, ci penserò

Sì, solo un triste riferimento implicito a un oggetto (per esempio la chiamata al metodo in invoke leaf di qualche delegato) è sopravvissuto nel boschetto di codice e la memoria è andata. Non si può nemmeno fare un pasticcio in Sharp.

Motivazione: