Mql5 dilinin özellikleri, incelikleri ve çalışma yöntemleri - sayfa 110

 

Ticaret, otomatik ticaret sistemleri ve ticaret stratejilerinin test edilmesi hakkında forum

Hatalar, hatalar, sorular

fxsaber , 2018.12.01 11:15

Süper fren tasarımı
 string Str[];
const int handle = FileOpen (FileName, FILE_READ | FILE_ANSI | FILE_TXT );  

FileReadArray (handle, Str);

1 milyon satırlık 40 MB'lık bir dosya 18 saniyede okunur.


Aynı çıktı, ancak farklı şekilde yapıldı

   uchar Bytes[];
   const int handle = FileOpen (FileName, FILE_READ | FILE_BIN );
  
   FileReadArray (handle, Bytes);

   string Str[];
   StringSplit ( CharArrayToString (Bytes), '\n' , Str);

0,5 saniyede tamamlanır.


 
Derlemek için yapay bir numara
 #define MACROS(A, B) A / B + !(A / B) // (A >= B) ? A / B : 1

template < typename T1, typename T2>
union UNION
{
  T1 a;
//  T2 b[sizeof(T1) / sizeof(T2)];       // '[' - invalid index value
  T2 b[MACROS( sizeof (T1), sizeof (T2))]; // OK
};

template < typename T1, typename T2>
void f()
{
   if ( sizeof (T1) >= sizeof (T2))
    UNION<T1, T2> Union;
   else
    UNION<T2, T1> Union;  
}

void OnStart ()
{
  f< int , char >();
}
 

auto_ptr'nin basit analogu (kullanımdan kaldırıldı). Not: oldukça benzer değil,
...


https://habr.com/post/140222/

Smart pointers для начинающих
Smart pointers для начинающих
  • habr.com
Эта небольшая статья в первую очередь предназначена для начинающих C++ программистов, которые либо слышали об умных указателях, но боялись их применять, либо они устали следить за new-delete. UPD: Статья писалась, когда C++11 еще не был так популярен. Итак, программисты С++ знают, что память нужно освобождать. Желательно всегда. И они знают...
 

pavlick_

Operatör= içinde, başına bir satır eklemeniz gerekir:

 if (p==other.p) return & this ;
 

Muhtemelen, kendinizi bunun gibi bir şeyle sınırlandırmalısınız (hiç kopyalayamazsınız):

 template < typename T_>
class unique_ptr{
   T_ *p;
public :
   unique_ptr( void *ptr= NULL ): p(ptr)           {}
   ~unique_ptr()                                {reset();}
   unique_ptr * operator =(T_ *p_)                {reset(); p = p_; return & this ;}
   // releases ownership of the managed object
   T_ *release()                                   {T_ *r = p; p = NULL ; return r;}
   // destroys the managed object 
   void reset()                                    { if (p) delete p; p= NULL ;}
   // returns a pointer to the managed object 
   T_ *get()                                       { return p;}
   unique_ptr( const unique_ptr<T_> &other);
   void operator =( const unique_ptr<T_> &other);
   void swap(unique_ptr<T_> &other){
      T_ *buf = p;
      p = other.p;
      other.p = buf;
   }
};
auto_ptr için neden bir kopya oluşturdum? µl - öğesinin eğriliği nedeniyle, bir yığın nesnesini CArrayObj öğesine kopyalamak için, yapıcıyı birkaç kez çağırarak bir grup nesne oluşturmanız gerekir. Ama buna değer olduğunu düşünmüyorum. Bu bağlamda, ilk mesajı yıkacağım.
 
pavlick_ :

auto_ptr için neden bir kopya oluşturdum? µl'nin eğriliği nedeniyle - bir yığın nesnesini CArrayObj'e kopyalamak için, yapıcıyı birkaç kez çağırarak bir grup nesne oluşturmanız gerekir.

Ve neden "eğrilik mkl"?

 
Alexey Navoykov :

Ve neden "eğrilik mkl"?

Önemsiz bir görev - bir diziye bir yığın nesnesinin bir kopyasını eklemek için bu + ile sonuçlanır, benim hiç ihtiyacım olmayan varsayılan bir kurucu yazmanız gerekir:

 class Q : public CObject {
public :
   Q() {}
   Q( int i) {}
};

void OnStart ()
{
   CArrayObj ar;
   Q q( 3 );
   
   Q *new_el = new Q;
   new_el = q;
   ar.Add(new_el);
   Q new_el2( 5 );
   q = new_el2;
}

Ölümcül değil, evet, Q'da init () yapabilirsiniz, bu sorunu biraz düzeltir, ancak yine de - tiksintiye neden olur. Ve elinizde kopyalanmış bir auto_ptr olduğunda, her şey iki satırda olur, ancak oyun muma değmez. Belki çok seçici, mükemmeliyetçilik.

 
pavlick_ :

Önemsiz bir görev - bir diziye bir yığın nesnesinin bir kopyasını eklemek için bu + ile sonuçlanır, benim hiç ihtiyacım olmayan varsayılan bir kurucu yazmanız gerekir:

Ölümcül değil, evet, Q'da init () yapabilirsiniz, bu sorunu biraz düzeltir, ancak yine de - tiksintiye neden olur. Ve elinizde kopyalanmış bir auto_ptr olduğunda, her şey iki satırda gerçekleşir, ancak oyun muma değmez. Belki çok seçici, mükemmeliyetçilik.

Ama sonuçta, C++'da her şey tamamen aynı, bu yüzden eğrinin neden µl olduğu çok açık değil.

Ve sizin durumunuzda, bir kopya oluşturucu ayarlamak ve öğeleri tek satıra eklemek daha kolaydır:

ar.Add( new Q(q));
 
pavlick_ :

Önemsiz bir görev - bir diziye bir yığın nesnesinin bir kopyasını eklemek için bu + ile sonuçlanır, benim hiç ihtiyacım olmayan varsayılan bir kurucu yazmanız gerekir:

Ölümcül değil, evet, Q'da init () yapabilirsiniz, bu sorunu biraz düzeltir, ancak yine de - tiksintiye neden olur. Ve elinizde kopyalanmış bir auto_ptr olduğunda, her şey iki satırda gerçekleşir, ancak oyun muma değmez. Belki çok seçici, mükemmeliyetçilik.

Yani her şey yine de oluyor - sadece auto_ptr'nizin arkasına gizlenmiş durumda...

Burada herhangi bir sorun görmüyorum.

Ben, sertleşmiş yaşlı bir osuruk olarak - hafızanın otomatik olarak silindiği C # yaklaşımını sevmiyorum. Benim için, onları isteyen kişi, oradaki bazı "çöp toplayıcıları" değil, nesneleri silmekten sorumlu olmalıdır.

 
Alexey Navoykov :

Ama sonuçta, C++'da her şey tamamen aynı, bu yüzden eğrinin neden µl olduğu çok açık değil.

Ve sizin durumunuzda, bir kopya oluşturucu ayarlamak ve öğeleri tek satıra eklemek daha kolaydır:

Nasıl aynı? Otomatik olarak bir kopya oluşturucu vardır ve tüm işlemler şöyle görünür:

 class Q : public CObject {
public :
   Q( int i) {}
};

void OnStart ()
{
   CArrayObj ar;
   Q q( 3 );
   
   ar.Add( new (q));
   q = Q( 5 );
}

Evet ve sizin durumunuzda bir kopya oluşturucu ayarlamak ve bir satıra öğeler eklemek daha kolaydır.

Doğal olarak, bu bir örnek için bir oyuncak sınıfıdır, gerçekte bazı verilerdir, belki de çoktur, bir kopya oluşturucu yazmak hiç bir seçenek değildir. Gerekli yerleri sarmalayıcılara sardık ve özel bir kurucuya gerek kalmadı.

Yani her şey yine de oluyor - sadece auto_ptr'nizin arkasına gizlenmiş durumda...

Burada herhangi bir sorun görmüyorum.

Ben, sertleşmiş yaşlı bir osuruk olarak - sadece belleğin otomatik olarak silindiği C # yaklaşımını sevmiyorum. Bana göre, onları talep eden kişi, oradaki "çöp toplayıcıları" değil, nesneleri silmekten sorumlu olmalıdır.

Mikrolitrelerde akıllı işaretçiler olmadan yapabilirsiniz. Çöp toplayıcı != akıllı işaretçiler, en azından istisnalar nedeniyle onlarsız yapamazsınız. Çöp toplayıcıyı da sevmiyorum.