Errores, fallos, preguntas - página 2362

 
Ilya Malev:

No tengo funciones ahí, pero es exactamente la tarea que describes. Tengo un CNode ( que tiene métodos Prev(), Next(), etc.) como clase base de la lista, y el bucle llama a los campos de COrder, que es su descendiente. El bucle llama a los campos de COrder, que es su descendiente. El bucle se declara en defines 1 vez y luego se utiliza en todas partes.

He intentado seguir tu ejemplo, pero quiero utilizar el typedef

#property strict
#include <Object.mqh>
#include <Arrays\List.mqh>
//+------------------------------------------------------------------+
class CMyclass:public CObject
  {
public:
   int               x;
   double            y;
   void              CMyclass(void):x(-1),y(-2.2) { }   
  };
  
typedef CMyclass (*PtrCMyclass)(CObject*); 
PtrCMyclass Myclass;
//+------------------------------------------------------------------+
void OnStart()
  {
   CList *base=new CList;
   for(int i=0;i<3;i++)
     {
      base.Add(new CMyclass);
      Myclass(base.GetCurrentNode()).x = 99;
      Myclass(base.GetCurrentNode()).y = -555.5;
     }
   for(int i=0;i<3;i++)
     {
      Print(Myclass(base.GetNodeAtIndex(i)).x," : ",Myclass(base.GetNodeAtIndex(i)).y);
     }
   delete base;
  }
//+------------------------------------------------------------------+

Ahora el compilador se salta mi ejemplo, pero necesito... se necesita algo... ¿pero qué? Me da un error al ejecutar:

llamada al puntero de la función nvalida en 'tst_file.mq4' (30,7)


 
Igor Makanu:

Probablemente tengas razón, he probado tu ejemplo, pero quiero usar el typedef

Ahora el compilador se salta mi ejemplo, pero necesito... necesito algo... ¿pero qué?

llamada al puntero de la función nvalida en 'tst_file.mq4' (30,7)


Así que necesito escribir una función y asignarla al puntero))

typedef CMyclass* (*PtrCMyclass)(CObject*);
CMyclass* FMyCast1(CObject*p){ CMyclass *r = dynamic_cast<CMyclass*>(p); if(CheckPointer( r ) != POINTER_INVALID) return r; else return NULL; }
PtrCMyclass Myclass = FMyCast1;
 
Ilya Malev:

Por lo tanto, es necesario escribir una función y asignarla a un puntero))

Hm, tiene sentido, pero entonces no me da para dirigirme a los campos de la clase si escribo la función de la siguiente manera

PtrCMyclass Myclass(CObject* obj){ return(GetPointer(obj)); };

'x' - tipo de estructura o clase esperada tst_file.mq4 30 38


 
Intenta lo que escribí arriba. Aunque el typedef no es realmente necesario aquí, porque es un "relleno" innecesario entre el código y la llamada a la función. Todavía no se puede sobrecargar esta llamada para otra clase utilizando el mismo puntero. Tendrás que hacer uno nuevo para cada clase. Ya es hora de que te des cuenta de que los typedefs son poco menos que completamente inútiles, imho :)
 
Igor Makanu:

((CMyclass*)base.GetNodeAtIndex(i)).x

 
Ilya Malev:
Intenta lo que escribí arriba. Aunque el typedef no es necesario aquí porque es un "espaciador" extra entre el código y la llamada a la función. Todavía no se puede sobrecargar esta llamada para otra clase utilizando el mismo puntero. Tendrás que hacer uno nuevo para cada clase. Ya es hora de que te des cuenta de que los typedefs son poco menos que completamente inútiles, imho :)

Lo he intentado, pero todavía no sé cómo trabajar con defans, la ciencia es complicada, me dio un error: tst_file EURUSD,H1: acceso de puntero no válido en 'tst_file.mq4' (31,56)

#property strict
#include <Object.mqh>
#include <Arrays\List.mqh>
//+------------------------------------------------------------------+
class CMyclass:public CObject
  {
public:
   int               x;
   double            y;
   void              CMyclass(void):x(-1),y(-2.2) { }
  };
//+------------------------------------------------------------------+
#define  alive(node)  (CheckPointer(node)==POINTER_DYNAMIC)
#define  loopf(type, node)  for(type *o; o=node;)
//+------------------------------------------------------------------+
void OnStart()
  {
   CList *base=new CList;
   CMyclass *res;
   for(int i=0;i<3;i++)
     {
      base.Add(new CMyclass);
      loopf(CMyclass,base.GetCurrentNode()){ o.x = 99; res.y = 555;}
     }

   for(int i=0;i<3;i++)
     {
      res=base.GetNodeAtIndex(i);
      Print(res.x," : ",res.y);
     }
   delete base;
  }
//+------------------------------------------------------------------+
 
TheXpert:

((CMyclass*)base.GetNodeAtIndex(i)).x

¡HOORAY! ¡¡¡FUNCIONÓ!!!

Gracias.

#property strict
#include <Object.mqh>
#include <Arrays\List.mqh>
//+------------------------------------------------------------------+
class CMyclass:public CObject
  {
public:
   int               x;
   double            y;
   void              CMyclass(void):x(-1),y(-2.2) { }
  };
//+------------------------------------------------------------------+
void OnStart()
  {
   CList *base=new CList;
   for(int i=0;i<3;i++)
     {
      base.Add(new CMyclass);
      ((CMyclass*)base.GetCurrentNode()).x = 99;
      ((CMyclass*)base.GetCurrentNode()).y = 555;
     }

   for(int i=0;i<3;i++)
     {
      Print(((CMyclass*)base.GetNodeAtIndex(i)).x," : ",((CMyclass*)base.GetNodeAtIndex(i)).y);
     }
   delete base;
  }
//+------------------------------------------------------------------+

;)

 
Igor Makanu:

Lo he intentado, pero todavía no sé cómo trabajar con los defans, la ciencia es complicada, me dio error: tst_file EURUSD,H1: invalid pointer access in 'tst_file.mq4' (31,56)

Me sorprendería mucho que mi bucle funcionara con tu nodo de la biblioteca))

Me refería al código typedef de mi último post, por supuesto))

Igor Makanu:

¡HOORAY! ¡¡¡FUNCIONÓ!!!

Gracias.

;)

De verdad, ¿por qué no intentaste la más obvia de una vez? :) ¿Tanto querías rockear con el typedef? =)))

 
Ilya Malev:

De verdad, ¿por qué no intentaste primero la más obvia? :) ¿Tanto querías rockear con typedef? =)))

Lo he probado! Estaba seguro de que no podría desreferenciar un puntero usando MQL, pero resultó ser trivial - ¡debería haber puesto más paréntesis! ))))

HH: typedef es un tema, lo intenté, pero tampoco me fue bien, todavía tengo que averiguar en qué me equivoqué, ¡mi ejemplo también debería funcionar con typedef!

 
Alexandr Sokolov:

¿Cuál es la razón por la que el indicador puede no funcionar sólo en el gráfico M1, pero en todos los demás gráficos funciona correctamente? (MQL5). Aquí está la función - y cuando le doy 0 en el gráfico M1, de alguna manera no suma una variable


Esto significa que hay una vela con Open = Close, mientras que el código está escrito incorrectamente y no contiene la comprobación de la división por 0. Este hecho desafortunado no depende del TF.