Preguntas sobre POO en MQL5 - página 73

 
Igor Makanu:

Bajando al nivel adecuado de comunicación: ¿mi pregunta es sobre el tema del hilo? ¿Por qué has venido aquí con tus fotos de Internet? ¿Sabes la respuesta? - No, siéntate y cállate ;)

En primer lugar, no me pinches, y en segundo lugar, no reacciones tan violentamente a la verdad.
Tengo que ser sincero con usted, tengo la impresión de que no está muy lejos de su interlocutor de hoy:

Cualquier pregunta de los principiantes en MQL4 y MQL5, ayuda y discusión de algoritmos y códigos

Igor Makanu, 2020.06.07 13:46

Hola a todos. Por favor, ayúdame a insertar una variable String en mi código. Gracias a

¿podrías responder a tu propia pregunta?
o ¿has recortado un trozo de código en alguna parte y no puedes usarlo? y tienes que adivinar lo que pasa al menos))
......
pero supongo que no es la respuesta con este enfoque

 

un moderador notoriamente amable ha prometido banearte por provocar una respuesta verbal :-)

esperando...

 
Algunos saben más, otros saben menos. El foro es para la comunicación y las preguntas y respuestas.
No hay que avergonzarse de hacer una pregunta para enriquecer el conocimiento. Es vergonzoso comportarse de forma condescendiente con los que preguntan, es el nivel de un estudiante que ha pasado al siguiente curso y transmite "conocimiento sagrado a través de la labia". Una zanganería total en general...
 
Maxim Kuznetsov:

un moderador notoriamente amable ha prometido banearte por provocar una respuesta verbal :-)

Espera...

Es difícil hacerme enfadar, y he utilizado todas las palabras malsonantes del ejército, no hay nada sin ellas )))

 
Maxim Kuznetsov:

un moderador notoriamente amable ha prometido banearte por provocar una respuesta verbal :-)

esperando...

No, Maxim, no es así. Por favor, vuelva a leerlo con la mente abierta.
 
#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. no se puede borrar un objeto de tipoJSONParser creado a través de new
casting sin sentido a
JSONParser*
¿Qué hay de malo en una variable local deJSONParser? ¿O quieres utilizar un objeto temporal pero no conoces su firma?

2. Fundición sin sentido enJSONObject*
3
. Las variables jv y jobj definitivamente no serán NULL? De lo contrario, la eliminación de un puntero nulo en MQL imprimirá "basura" en el registro.

 
Sergey Dzyublik:


1. no se puede borrar un objeto de tipoJSONParser creado a través de new
casting sin sentido a
JSONParser*
¿Qué hay de malo en una variable local deJSONParser? ¿O quieres utilizar un objeto temporal pero no conoces su firma?

2. Fundición sin sentido enJSONObject*
3
. Las variables jv y jobj definitivamente no serán NULL? De lo contrario, la eliminación de un puntero nulo en MQL imprimirá "basura" en el registro.

Gracias, al menos eso es algo.

este método fue utilizado por el autor de la biblioteca, no veo el sentido de escribir llamadas para el análisis sintáctico de otra manera


no entiendo la situación con MQL cuando se trabaja con punteros - no se puede dereferenciar cuando el puntero se convierte en una entidad, y cuando es un puntero a un objeto - no sé qué hacer ((

SZY: Yo estudié C++ hace 20 años, luego no se usa mucho para los ingenieros de producción, primero se sentaron todos en Delphi, luego se arrastraron a Sharp, para los controladores también, no he visto C++, todo funciona en softwareespecializado- es probablemente el sello de las universidades para los estudiantes de ingeniería - siempre empiezan la formación con Pascal, incluso en la Politécnica de Volgogrado leen turbo-pascal....A saber de dónde sacan los compiladores ))))


ZS: quitar el estribillo, no es agradable, suele ser al revés.

 
Igor Makanu:

Gracias, eso es algo.

el sin sentido no es aplicable, este método fue utilizado por el autor de la biblioteca, no veo el punto en la escritura de otra manera de parsing llamadas


con MQL la situación no es clara cuando se trata de punteros - no se puede dereferenciar cuando el puntero se convierte en una entidad, y cuando es un puntero a un objeto - no sé qué hacer (((

SZY: Yo estudié C++ hace 20 años, luego no se usa mucho para los ingenieros de producción, primero se sentaron todos en Delphi, luego se arrastraron a Sharp, para los controladores también, no he visto C++, todo funciona en softwareespecializado- es probablemente el sello de las universidades para los estudiantes de ingeniería - siempre empiezan la formación con Pascal, incluso en la Politécnica de Volgogrado leen turbo-pascal....A saber de dónde sacan los compiladores ))))


SZY: quitar el estribillo, no es agradable, suele ser al revés.

Aquí no hay punteros) Hay un manejador para la clase, sí trabajar con él es similar a trabajar con un puntero, pero ahí termina lo común.

Ahora, el resaltado:

  • Se crea un objeto en la pila o en el montón.
    CTest test;             //test - object
    CTest* test=new CTest;  //test - handle of object
    En el primer caso, el compilador añade una llamada destructiva implícita, que no limpia ninguna memoria; sólo devuelve el puntero de la pila a la posición anterior a la llamada de la función. En el segundo caso, al salir del ámbito, la memoria ocupada por el objeto queda marcada como ocupada por el gestor de memoria y como ya no hay ningún puntero que apunte a ella, no se puede liberar (es lo que se llama una fuga de memoria), por lo que tenemos que destruir explícitamente el objeto mediante el borrado.
  • En cuanto al tiempo de ejecución local. En este caso, si no hay una función sobrecargada especialmente para ella, se dereferenciará implícitamente, ejemplo:
    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í, y olvídate de Sharp, nada en común en absoluto))))
 

Vladimir Simakov:

PS. Sí, y olvídate de Sharp, nada en común)))

No lo conseguirás, te acostumbras a lo bueno siempre, es lógico, si metes la pata - VS te lo dirá enseguida, y cuando se ejecute el código - dejas el cuerpo de la función - olvídate de él, simplemente asignas NULL al código creado y se quita el lío solo ))

Gracias, lo pensaré

 
Igor Makanu:

No va a funcionar, se acostumbra a una cosa buena muy rápidamente, todo es lógico, si usted se equivoca en alguna parte - VS le dirá de inmediato, y en la ejecución de código que deja el cuerpo de la función - que acaba de olvidar, a lo sumo que ha creado NULL - se aclarará por sí mismo ))

Gracias, lo pensaré

Sí, sólo una triste referencia implícita a un objeto (por ejemplo, la llamada a un método en la hoja de invocación de algún delegado) vive en la espesura del código y la memoria desaparece. Tampoco se puede hacer un lío en Sharp.