Genel sınıflar kütüphanesi - hatalar, açıklamalar, sorular, kullanım özellikleri ve öneriler - sayfa 25

 
Andrey Pogoreltsev :

Yalnızca yerleşik türler için uygunlarsa, neden koleksiyonlar oluşturup bunları kod tabanına koyalım?)

gömme yapılar için de uygun değildirler.

 
Andrey Pogoreltsev :

Söyle bana, belki bir şey anlamıyorum, ama bu tür bir yapı kullanmaya çalışırsam:

sonra hatayı alıyorum:

'Seçenek' - nesneler yalnızca referans olarak iletilir ICollection.mqh on dört on sekiz

peki, daha fazla hata yığını var ...

bu şekilde olmaz şablon şablonlar üzerinden yapman lazım bu konuyu ben de hallettim o yüzden kendime bir test örneği yaptım herşey doğru gibi

class CData - listede saklamak istediğimiz yapı

CDataBase - listenin kendisi

 #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;
  }
//+------------------------------------------------------------------+

OnStart() içinde - bir liste oluşturuyoruz, ona değerler yazıyoruz ve sonra okuyoruz, 2 kez kontrol ediyorum çünkü ilk başta, bir yerde listeye yazarken yerel bir değişkenin görünürlüğünü kaybettim - her şeyi tamam yazdım ve okuduğumda sıfır işaretçileri okudum ve bir hata aldım

 
Igor Makanu :

bu şekilde olmaz şablon şablonlar üzerinden yapman lazım bu konuyu ben de hallettim o yüzden kendime bir test örneği yaptım herşey doğru gibi

class CData - listede saklamak istediğimiz yapı

CDataBase - listenin kendisi

OnStart() içinde - bir liste oluşturuyoruz, ona değerler yazıyoruz ve sonra okuyoruz, 2 kez kontrol ediyorum çünkü ilk başta, bir yerde listeye yazarken yerel bir değişkenin görünürlüğünü kaybettim - her şeyi tamam yazdım ve okuduğumda sıfır işaretçileri okudum ve bir hata aldım

Bu kod sizin için çalışır, çünkü CData hala bir sınıftır ve bir yapı değildir. Sınıflar ve yapılar için aynı anda jenerik kullanmaya çalışırsanız, özellikle silme operatörü ile ilgili sorunlar hemen ortaya çıkacaktır. Bu "jenerik" ile yaptığım deneylerde buna ikna oldum. Sonuç olarak, bu "jenerik" lib'de hiçbir silme operatörü yoktur ve böyle bir "koleksiyona" yeni bir sınıf tıklarsanız, programdan çıktıktan sonra bir sürü kayıp nesne olacaktır. Onlar. Bu jeneriğin başlangıçta yalnızca ilkel türler için yazıldığı görülmektedir.

 
Vasiliy Sokolov :

Bu kod sizin için çalışır, çünkü CData hala bir sınıftır ve bir yapı değildir. Sınıflar ve yapılar için aynı anda jenerik kullanmaya çalışırsanız, özellikle silme operatörü ile ilgili sorunlar hemen ortaya çıkacaktır. Bu "jenerik" ile yaptığım deneylerde buna ikna oldum. Sonuç olarak, bu "genel" lib'de hiçbir silme operatörü yoktur ve böyle bir "koleksiyona" yeni bir sınıf tıklarsanız, programdan çıktıktan sonra bir sürü kayıp nesne olacaktır. Onlar. Bu jeneriğin başlangıçta yalnızca ilkel türler için yazıldığı görülmektedir.

Tabii ki bu bir sınıf, yapı değil, MQL'de yapıları kullanmayı bıraktım, yapılar herhangi bir avantaj sağlamıyor, ancak yapılarla çalışırken sürekli hatalar ve zaman kaybı, adminlerden yapılarla ilgili sorulara eski mesajlar verdiler, temel olarak cevap verdiler, yapılar yerine bir sınıf kullandılar - şimdi yapıları hiç kullanmıyorum

Not: Yapıları kullanmayı bıraktığımda buldum https://www.mql5.com/en/forum/6343/page866#comment_7541747

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

Yalnızca yerleşik türler için uygunsa neden koleksiyonlar oluşturup bunları kod tabanına koyalım?)

Standart teslimatta sağlanan kolaylık. Bu nedenle, çekmeye gerek yoktur - her kullanıcıda vardır.

Bunu KB-lib'lerimden birinde uzun süredir kullanıyorum.

 
Igor Makanu :

bu şekilde olmaz şablon şablonlar üzerinden yapman lazım bu konuyu ben de hallettim o yüzden kendime bir test örneği yaptım herşey doğru gibi

class CData - listede saklamak istediğimiz yapı

CDataBase - listenin kendisi

OnStart() içinde - bir liste oluşturuyoruz, ona değerler yazıyoruz ve sonra okuyoruz, 2 kez kontrol ediyorum çünkü ilk başta, bir yerde listeye yazarken yerel bir değişkenin görünürlüğünü kaybettim - her şeyi tamam yazdım ve okuduğumda sıfır işaretçileri okudum ve bir hata aldım

Her şeyden önce, ayırıcınızı listeye uyguladınız ve işaretçileri orada depoladınız. Sadece bu değil, yok edildiğinde sızıntılarınız var)

İkincisi, doğru olana göre, bunu atama operatörü değil, kopya oluşturucu aracılığıyla yapmak gerekiyordu. Ama hepsi bu kadar IMHO)

Ve en önemlisi: geliştiricilerin yalnızca jenerikleri tamamlaması, ayırıcıları içeride yapması ve özel nesneler için desteklemesi gerekir. C++ zaten onlar için her şeyi icat etti) Ve bizim bisiklet icat etmemize gerek yok.

 
Andrey Pogoreltsev :

Her şeyden önce, ayırıcınızı listeye uyguladınız ve işaretçileri orada depoladınız. Sadece bu değil, yok edildiğinde sızıntılarınız var)

Sızıntılar nasıl belirlenir?

Not: bu bir test örneği, MQL'de listelerle nasıl çalışılacağını bulmam gerekiyordu, bu yüzden testler yaptım

 
Andrey Pogoreltsev :

Ve en önemlisi: geliştiricilerin yalnızca jenerikleri tamamlaması, ayırıcıları içeride yapması ve özel nesneler için desteklemesi gerekir. C++ zaten onlar için her şeyi icat etti) Ve bizim bisiklet icat etmemize gerek yok.

her şey bu kadar basitse yaz

 
Igor Makanu :

Sızıntılar nasıl belirlenir?

Not: bu bir test örneği, MQL'de listelerle nasıl çalışılacağını bulmam gerekiyordu, bu yüzden testler yaptım

AddValue'da nesnelerin kopyalarını yeni ile yaratırsınız, ancak onları yıkıcıda serbest bırakmazsınız, sadece işaretçiler listesini temizlersiniz.

 
TheXpert :

her şey bu kadar basitse yaz

Zaman ve zorunluluk olacak - yazacağım. Genel olarak, örnek olarak, yalnızca bir rulman modeline ihtiyacınız varsa, kendi rulman fabrikanızı oluşturmak iyi bir konu değildir)