Libreria di classi generiche - bug, descrizione, domande, caratteristiche d'uso e suggerimenti - pagina 25

 
Andrey Pogoreltsev:

Ma perché creare collezioni e metterle in un kodobase se sono buone solo per i tipi incorporati)?

Non vanno bene neanche per le strutture incorporate.

 
Andrey Pogoreltsev:

Ditemi, forse non capisco qualcosa, ma se cerco di usare una costruzione di questo tipo:

Ricevo un errore:

'Option' - gli oggetti sono passati solo per riferimento ICollection.mqh 14 18

e dopo c'è un'intera pila di errori...

Questo non funzionerà, attraverso un modello di template bisogna fare, ho anche lavorato con questo problema, ecco un esempio di test, sembra funzionare correttamente

classe CData - struttura che vogliamo memorizzare nella lista

CDataBase - la lista stessa

#property strict
#include <Arrays\List.mqh>

//+------------------------------------------------------------------+
class CData : public CObject
  {
public:
   int               x;
   double            y;
   datetime          t;
  };
//+------------------------------------------------------------------+
template<typename TDB>class CDataBase
  {
private:
   CList            *mlist;
   TDB              *TDBptr;
public:
   void CDataBase()           { mlist=new CList;                                       }
   void ~CDataBase(void)      { delete mlist;                                          }
   int ArraySize(void)        { return(mlist.Total());                                 }
   TDB *operator[](int index) { return(mlist.GetNodeAtIndex(index));                   }
   void  AddValue (TDB &value){ TDBptr = new TDB; TDBptr  = value; mlist.Add(TDBptr);  }
   string TypeName()          { return(typename(TDB));                                 }
   };
//+------------------------------------------------------------------+
// проверка, запишем  распринтуем значения
void OnStart()
  {

   CDataBase<CData>*data=new CDataBase<CData>;
   CData *my=new CData;

   int i;
   Print("1------------------------------------");
   for(i=0; i<10; i++)
     {
      my.x=i;
      my.y= i*2;
      data.AddValue(my);
      Print(i," : ",data[i].x," , ",data[i].y," / ",my.x," ,",my.y);
     }
   Print("2------------------------------------");
   for(i=0; i<data.ArraySize(); i++)
     {
      Print(i," : ",data[i].x," , ",data[i].y);
     }
   Print(data.TypeName());
   delete my;
   delete data;
  }
//+------------------------------------------------------------------+

In OnStart() - creare una lista, scriverci dei valori e poi leggerli. Lo controllo 2 volte, perché all'inizio da qualche parte ho perso la visibilità di una variabile locale quando scrivevo nella lista - scrivevo tutto ok, ma quando leggevo, poi ottenevo puntatori nulli e un errore

 
Igor Makanu:

Non funzionerà in questo modo, devi usare template di modelli, anche io ho avuto a che fare con questo problema, ho fatto un esempio di test, tutto sembra funzionare correttamente

classe CData - la struttura che vogliamo memorizzare nella lista

CDataBase - la lista stessa

In OnStart () - creare una lista, scriverci dei valori e poi leggerli. Lo controllo due volte, perché prima ho perso da qualche parte la visibilità di una variabile locale quando scrivevo nella lista - stavo scrivendo tutto ok, ma quando leggevo, poi ho ottenuto puntatori nulli e un errore

Il tuo codice funziona perché CData è ancora una classe, non una struttura. Se cercate di usare il generatore per classi e strutture contemporaneamente, avrete problemi, specialmente con l'operatore di cancellazione. Ne sono stato convinto attraverso i miei esperimenti con questo "generico". Il punto è che questa libreria "generica" non ha affatto un operatore di cancellazione e se si aggiunge una nuova classe a tale "collezione", dopo l'uscita dal programma ci saranno molti oggetti persi. Cioè è ovvio che originariamente questo generico è stato scritto solo per i tipi primitivi.

 
Vasiliy Sokolov:

Questo codice funziona perché CData è una classe, non una struttura. Se provate ad usare i generici per le classi e le strutture allo stesso tempo, incontrerete immediatamente dei problemi, specialmente con l'operatore di cancellazione. Ne sono stato convinto attraverso i miei esperimenti con questo "generico". Il punto è che questa libreria "generica" non ha affatto un operatore di cancellazione e se si aggiunge una nuova classe a tale "collezione", dopo l'uscita dal programma ci saranno molti oggetti persi. Cioè potete vedere che originariamente questo generico è stato scritto solo per i tipi primitivi.

Ho smesso di usare le strutture in MQL, la struttura non ha vantaggi, ma i costanti bug e la perdita di tempo mentre si lavora con le strutture che forniscono - ho letto i vecchi post degli amministratori con domande sulle strutture e in pratica dicevano di usare la classe invece della struttura - ora non uso affatto le strutture

SZZ: ho trovato questo quando ho smesso di usare le strutturehttps://www.mql5.com/ru/forum/6343/page866#comment_7541747

Вопросы от начинающих MQL5 MT5 MetaTrader 5
Вопросы от начинающих MQL5 MT5 MetaTrader 5
  • 2018.05.23
  • www.mql5.com
Подскажите пожалуйста, такой показатель тестера в жизни реален? И хороший это или плохой результат за год с депо 3000...
 
Andrey Pogoreltsev:

perché creare collezioni e metterle in un kodobase se sono buone solo per i tipi incorporati)?

Comodità che sono di serie. Quindi, non c'è bisogno di tirare - ogni utente ne ha uno.

Lo uso in uno dei miei libretti di KB per molto tempo.

 
Igor Makanu:

Non funzionerà in questo modo, devi usare template di modelli, anche io ho avuto a che fare con questo problema, ho fatto un esempio di test, tutto sembra funzionare correttamente

classe CData - la struttura che vogliamo memorizzare nella lista

CDataBase - la lista stessa

In OnStart () - creare una lista, scriverci dei valori e poi leggere, 2 volte lo controllo, perché all'inizio da qualche parte ho perso la visibilità di una variabile locale quando scrivevo nella lista - scrivevo tutto ok, ma quando leggevo, poi ho avuto dei puntatori nulli letti e ho avuto un errore

Beh, prima di tutto hai implementato il tuo allocatore su una lista e memorizzi i puntatori lì. Non solo, si ha una perdita quando si distrugge).

Secondo, avresti dovuto usare correttamente il costruttore di copia invece dell'operatore di assegnazione. Ma tutto questo è IMHO)

E soprattutto: gli sviluppatori devono solo finalizzare i generici, rendere gli allocatori all'interno e supportare gli oggetti personalizzati. C++ ha già inventato tutto per loro) E non dobbiamo inventare le biciclette.

 
Andrey Pogoreltsev:

Beh, prima di tutto avete implementato il vostro allocatore su una lista e memorizzate lì i puntatori. Non solo, hai perdite sulla distruzione)

Come avete rilevato le perdite?

SZZ: è un esempio di test, dovevo capire come lavorare con le liste in MQL, così ho fatto dei test.

 
Andrey Pogoreltsev:

E soprattutto: gli sviluppatori dovrebbero solo finire i generici, fare allocatori all'interno e supportare gli oggetti personalizzati. C++ ha già inventato tutto per loro) E non dobbiamo inventare le biciclette.

Scrivilo se è così semplice.

 
Igor Makanu:

come sono state individuate le perdite?

ZS: è un esempio di test, dovevo capire come lavorare con le liste in MQL, così ho fatto dei test.

Si creano copie di oggetti in AddValue tramite new, ma non li si libera nel distruttore, si cancella solo la lista dei puntatori.

 
TheXpert:

scrivere se è così semplice.

Quando avrò il tempo e il bisogno, scriverò. E in generale, come esempio, creare una propria fabbrica di cuscinetti non è una buona idea se si ha bisogno di un solo modello di cuscinetto)

Motivazione: