MQL5'te OOP hakkında sorular - sayfa 68

 
Dmitry Fedoseev :

Ve ne? Başka bir yama. Bu, kalıpların taraftarlarının onu tanımadığı bir şey, görünüşe göre Ortodoks değil, kanonik değil. Neden özyineleme değil? Ayrıca bir özyineleme, yalnızca birlikte değil, çapraz.

Igor sadece iki adet döngüsü olduğundan ve bir mucizeyi bir döngüye sıkıştıramadığından şikayet etti.
Bu yüzden bu siteyi bir örnekle hatırladım, döngüler olmadan da yapılabilir. Ve bir mucize olacak
Bu yüzden düşünmek için bir seçenek önerdim)) döngüler olmadan sığabilir.
Ve birinin, dine uymayan bir şeyin herkesin işi olduğu gerçeği.

 
Roman :

Igor sadece iki adet döngüsü olduğundan ve bir mucizeyi bir döngüye sıkıştıramadığından şikayet etti.

şikayet etmedim ama programcılardan sırlar öğrendim :)

Yapabilirim, döngüyü sarabilir ve tekrarlayabilirim (değiştirebilirim), bu iyi bir fikir olur :)

Roma :

Ve birinin, dine uymayan bir şeyin herkesin işi olduğu gerçeği.

bu dinle ilgili değil, ama köklü programlama teknikleri olduğunu anlamakla ilgilidir ve bu teknikler çoğunluk tarafından kullanılıyorsa, o zaman etkilidir - hız açısından verimli, kod okunabilirliği açısından verimli, daha fazla destek açısından verimli, yeniden kullanım açısından verimli. ..

ve din? IMHO, programlamada know-how, genellikle malzemeye (veya bilgiye) sahip olmak ve daha sonra bu "tırmıkları" kendi inovasyonları olarak dağıtmak değildir.

 
Igor Makanu :

şikayet etmedim ama programcılardan sırlar öğrendim :)

Yapabilirim, döngüyü sarabilir ve tekrarlayabilirim (değiştirebilirim), bu iyi bir fikir olur :)

bu dinle ilgili değil, ama köklü programlama teknikleri olduğunu anlamakla ilgilidir ve bu teknikler çoğunluk tarafından kullanılıyorsa, o zaman etkilidir - hız açısından verimli, kod okunabilirliği açısından verimli, daha fazla destekte verimli, yeniden kullanımda verimli. ..

ve din? IMHO, programlamada know-how, genellikle malzemeye (veya bilgiye) sahip olmak ve daha sonra bu "tırmıkları" kendi inovasyonları olarak dağıtmak değildir.

Örneklerden biri, örneğin metaprogramlama modelini kullandığından bahseder.
Şablonları kullanarak, görev için uygun olduğu sürece derleme zamanında hesaplamalar yapan programlar yazabilirsiniz.
Bu tür programlara şablon metaprogramlar denir.
Terminalin MetaTrader olarak adlandırılması boşuna değil.
;))

 
Igor Makanu :

Şikayet etmedim ama programcılardan sırlar öğrendim :)

Yapabilirim, döngüyü sarabilir ve tekrarlayabilirim (değiştirebilirim), bu iyi bir fikir olur :)

bu dinle ilgili değil, ama köklü programlama teknikleri olduğunu anlamakla ilgilidir ve bu teknikler çoğunluk tarafından kullanılıyorsa, o zaman etkilidir - hız açısından verimli, kod okunabilirliği açısından verimli, daha fazla destekte verimli, yeniden kullanımda verimli. ..

ve din? IMHO, programlamada know-how, genellikle malzemeye (veya bilgiye) sahip olmak ve daha sonra bu "tırmıkları" kendi inovasyonları olarak dağıtmak değildir.

Igor, sabah karşı koyamadı ve dizine çevrimsiz herhangi bir yöntem çağrısı yaptı. Bu gerçekten işe yarar. *Dikkat, kullanılmış SB :))

 #include <Arrays\List.mqh>
//+------------------------------------------------------------------+
class base : public CObject
  {
public :
   virtual void       HighPriorityTask() {}
   virtual void       Task() {}
  };
//+------------------------------------------------------------------+
class A: public base
  {
private :
   static             A*lastnode;
   static             A*rootnode;
   static int         ID_counter;

public :
   int                ID;
                     A()
     {
      Prev((CObject*)lastnode);
      A*self = GetPointer ( this );
       if (lastnode)
         lastnode.Next(self);
      lastnode=self;
       if (rootnode== NULL )
         rootnode=self;
      ID=ID_counter++;
     }
   static   A*        GetRoot() { return rootnode;}

   virtual void       HighPriorityTask() { Print ( __FUNCSIG__ , " ID=" ,ID); A* next=(A*)Next(); if (next!= NULL ) next.HighPriorityTask(); }
  };
A* A::rootnode= NULL ;
A* A::lastnode= NULL ;
int A::ID_counter= 0 ;
//+------------------------------------------------------------------+
class B: public base
  {
public :
   virtual void       Task() { Print ( __FUNCSIG__ ); }
  };

//+------------------------------------------------------------------+
void OnStart ()
  {
   base *obj[ 4 ];;
   obj[ 0 ] = new A;
   obj[ 1 ] = new A;
   obj[ 2 ] = new B;
   obj[ 3 ] = new B;
   A* arr[ 5 ];
   for ( int i= 0 ; i< 5 ; i++)
     {
      arr[i]= new A();
     }
   if (A::GetRoot()!= NULL )
      A::GetRoot().HighPriorityTask();
   for ( int i= ArraySize (obj)- 1 ; i>= 0 ; i--)
     {
       //obj[i].HighPriorityTask();
      obj[i].Task();
     }

   for ( int i= ArraySize (obj)- 1 ; i>= 0 ; i--)
       delete obj[i];
   for ( int i= 0 ; i< 5 ; i++)
     {
       delete arr[i];
     }
  }
//+------------------------------------------------------------------+
 
Dmitry Fedoseev :

Ve ne? Başka bir yama. Bu, kalıpların taraftarlarının onu tanımadığı bir şey, görünüşe göre Ortodoks değil, kanonik değil. Neden özyineleme değil? Ayrıca bir özyineleme, sadece birlikte değil, çapraz.

buna "döngü açma" denir ve herhangi bir OO olmadan ve şablonlar derleyici tarafından yapılır (en azından yapmalıdır).

Ara koda bakarsanız (birleştiricide), o zaman bir satırda döngü yerine sadece N işlem olacaktır.

 
Beklenmedik bir sonuç aldı.
 #include <fxsaber\Benchmark.mqh> // https://c.mql5.com/3/321/Benchmark.mqh

// Простая структура.
struct STRUCT1
{
   int i;  
   double j[ 2 ];
};

// Сложная структура.
struct STRUCT2
{
   int i;  
   string Str;
  
  STRUCT2() : Str( "1234567 1234567" )
  {
  }
};

template < typename T>
int Func( T &Array[] )
{  
   // Write
   for ( int i = ArraySize (Array) - 1 ; i >= 0 ; i--)
    Array[i].i = i;

   int Sum = 0 ;
  
   // Read
   for ( int i = ArraySize (Array) - 1 ; i >= 0 ; i--)
    Sum += Array[i].i;
    
   return (Sum + ArraySize (Array));    
}

void OnStart ()
{
  STRUCT1 Array1[]; // Простая структура.
  STRUCT2 Array2[]; // Сложная структура.
  
   const int Amount = 5 e7;
  
   Print (_B( ArrayResize (Array1, Amount), 1 ));
   Print (_B( ArrayResize (Array2, Amount), 1 ));
    
   Print (_B(Func(Array1), 1 )); // Чтение и запись простой структуры происходит в разы дольше,
   Print (_B(Func(Array2), 1 )); // чем сложной.
}


         50000000
         Alert : Time[Test6.mq5 280 : ArrayResize (Array2,Amount)] = 640 ms.
         50000000
         Alert : Time[Test6.mq5 282 : Func(Array1)] = 440 ms.
         1333106752
         Alert : Time[Test6.mq5 283 : Func(Array2)] = 156 ms.
         1333106752
 
fxsaber :
Beklenmedik bir sonuç aldı.


sizeof aracılığıyla yapıların boyutları nelerdir, yoksa bilgisayar başında değilim?
 
Vladimir Simakov :
sizeof aracılığıylayapıların boyutları nelerdir, yoksa bilgisayar başında değilim?
        : sizeof (STRUCT1) = 20
        : sizeof (STRUCT2) = 16

Basit bir yapının boyutu ne kadar büyük olursa, çalışması o kadar yavaş olur.

 
fxsaber :

Basit bir yapının boyutu ne kadar büyük olursa, çalışması o kadar yavaş olur.

ilk yapıyı {int;int;double[2]} yap
 
Vladimir Simakov :
ilk yapıyı {int;int;double[2]} yap
         Alert : Time[Test6.mq5 285 : Func(Array1)] = 378 ms.
         Alert : Time[Test6.mq5 286 : Func(Array2)] = 156 ms.
Hizalama söz konusu değil. Hemen kontrol ettim.