Errori, bug, domande - pagina 2362

 
Ilya Malev:

Non ho funzioni lì, ma è esattamente il compito che hai descritto. Ho un CNode (che ha metodi Prev(), Next(), ecc.) come classe base della lista, e il ciclo chiama i campi di COrder, che è il suo discendente. Il ciclo chiama i campi di COrder, che è il suo discendente. Il ciclo è dichiarato in definisce 1 volta e poi è usato ovunque.

Ho provato a seguire il tuo esempio, ma voglio usare 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;
  }
//+------------------------------------------------------------------+

Ora il compilatore salta il mio esempio, ma ho bisogno di ... qualcosa è necessario ... ma cosa? Ottengo un errore durante l'esecuzione:

chiamata al puntatore di funzione non valida in 'tst_file.mq4' (30,7)


 
Igor Makanu:

Probabilmente hai ragione, ho provato il tuo esempio, ma voglio usare typedef

Ora il compilatore salta il mio esempio, ma ho bisogno... ho bisogno di qualcosa... ma cosa?

chiamata al puntatore di funzione non valida in 'tst_file.mq4' (30,7)


Quindi, devo scrivere una funzione e assegnarla al puntatore)))

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:

Quindi, dovete scrivere una funzione e assegnarla a un puntatore)))

Hm, ha senso, ma allora non mi dà un punto per indirizzare i campi della classe se scrivo la funzione nel modo seguente

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

'x' - tipo di struttura o classe atteso tst_file.mq4 30 38


 
Prova come ho scritto sopra. Anche se il typedef non è veramente necessario qui, perché è un'inutile "imbottitura" tra il codice e la chiamata della funzione. Non potete ancora sovraccaricare questa chiamata per un'altra classe usando lo stesso puntatore. Dovrete farne uno nuovo per ogni classe. Era ora che ti rendessi conto che i typedef sono poco meno che completamente inutili, imho :)
 
Igor Makanu:

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

 
Ilya Malev:
Prova come ho scritto sopra. Anche se il typedef non è necessario qui perché è un "distanziatore" extra tra il codice e la chiamata della funzione. Non potete ancora sovraccaricare questa chiamata per un'altra classe usando lo stesso puntatore. Dovrete farne uno nuovo per ogni classe. Era ora che ti rendessi conto che i typedef sono poco meno che completamente inutili, imho :)

Ho provato, ma non so ancora come lavorare con defans, la scienza è complicata, ho ottenuto un errore: tst_file EURUSD,H1: accesso puntatore non valido in '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

URRÀ! HA FUNZIONATO!!!

Grazie!

#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:

Ho provato, ma non so ancora come lavorare con defans, la scienza è complicata, ho avuto un errore: tst_file EURUSD,H1: accesso puntatore non valido in 'tst_file.mq4' (31,56)

Sarei molto sorpreso se il mio ciclo funzionasse con il tuo nodo di libreria)))

Mi riferivo al codice typedef nel mio ultimo post, ovviamente)))

Igor Makanu:

URRÀ! HA FUNZIONATO!!!

Grazie!

;)

Davvero, perché non hai provato subito la più ovvia? :) Volevi così tanto scatenarti con il typedef? =)))

 
Ilya Malev:

Davvero, perché non hai provato prima la più ovvia? :) Volevi così tanto spaccare con i typedef? =)))

Ho provato! Ero sicuro che non sarei stato in grado di dereferenziare un puntatore usando MQL, ma si è rivelato banale - avrei dovuto mettere più parentesi! ))))

ZS: typedef è un argomento, l'ho provato, ma non è andato bene, devo ancora capire dove ho sbagliato, il mio esempio dovrebbe funzionare anche con typedef!

 
Alexandr Sokolov:

Qual è la ragione per cui l'indicatore può non funzionare solo sul grafico M1, ma su tutti gli altri grafici funziona correttamente? (MQL5). Ecco la funzione - e quando le do 0 sul grafico M1, in qualche modo non somma una variabile


Questo significa che c'è una candela con Open = Close, mentre il codice è scritto male e non contiene il controllo della divisione per 0. Questo fatto spiacevole non dipende dal TF.