MQL5'te OOP hakkında sorular - sayfa 46

 
Igor Makanu :

bu tam olarak bıraktığım şey, ama ilk başta yaptım

bu yaklaşımla - "her şeyin olduğu yerde" temel sınıftan miras alın - her şey çalışır, ancak birkaç sınıf alanı oluşturmaya çalışmak ve sonra her sınıf alanına birkaç alan eklemek istediğimize kadar, hadi hepsini yenelim dinamik bir sınıf dizisi

ve Save (int hndl) yönteminin kendisini anlıyoruz - bunu temel sınıfta uygulayamıyoruz, bu yöntem esasen tartışıldığı gibi hiç gerekli olmayan bir arayüz olacak - arayüzler olmadan da yazabilirsiniz

bununla, sorun değil, hepsi bir zevk ve görev meselesi, genellikle kod esnekliği konusundaki çabalarımı en üst düzeye çıkarırım - minimum hareket - sonuç çözülmüş yeni bir problemdir, terminolojiyi affet)))


ancak sorun şu ki, bir dosyaya kaydetmeyi uygularken, farklı türlerdeki toplam kayıt sayısını tanımlamanız gerekecek bir dosya başlığı geliştirmeniz gerekecek, o zaman mantığı / kaydetme sırasını kaybetmenize gerek kalmayacak. her şeyi doğru okumak için veri .... ve bir sınıftaki en az bir alan değiştirilmişse final olacaktır.

IMHO, temel sınıftan bu tür "hafif" mirasın karmaşıklığı - küçük bir veritabanının geliştirilmesi ve bakımına, herhangi bir sınıftaki değişikliklerin sürekli izlenmesine bağlıdır.

 public :
 void CBase::Save(...){
    SaveHeard(...);
    _Save(...)}
virtual void SaveHeard(...){...}

protected :
   void _Save(...){
       CBase::_Save(...);
       ...}

Böyle bir şey))))

 
Vladimir Simakov :

Böyle bir şey))))

evet, tüm bunlar anlaşılabilir, ancak yerleşik "mucl bu sizin için C değil" için yalnızca, görevler tarafından iyi yapılandırılmış koda güvenmenin hiçbir anlamı olmadığını ekleyebilir - MQL görevleri her zaman son derece uzmanlaşmıştır ve büyükleri yeniden kullanır kod genellikle verimsizdir

Not: IMHO, MQL kodunun ana görevi, test cihazında kullanmak veya kodu tek bir tıklamayla yürütmek için mümkün olduğunca hızlı olmaktır - keneleri atlamadan her şey açık görünüyor, ancak sınırlamalar da var - PC / terminalin bağlantısını kesme ve yeniden başlatma durumunu görmezden gelemezsiniz ve burada tüm bunlarda sadece güzel ve yapılandırılmış bir kod değil, optimum olanı bulmanız gerekir.

 
Igor Makanu :

2. operatörü= tanımlamak ve içinde yerel kopyalama operatörünü kullanmak için bir hack var mı? .... yani aramanın bir yolu ::=

Bir yol var ve her zamanki gibi çözüm basit:

 struct SMatrix
{
   struct SMATRIX{
   SMATRIX(){}
   struct SRow{ int COL[];};
   SRow ROW[];
   };
   SMATRIX MATRIX;
   SMatrix(){}
   SMatrix( const int rows, const int cols){ this .Resize(rows,cols); }
   void Resize( const int rows, const int cols){ ArrayResize ( this .MATRIX.ROW,rows); for ( int i= 0 ;i<rows; i++){ ArrayResize ( this .MATRIX.ROW[i].COL,cols); }}
   void Free() { for ( int i= 0 ;i< ArraySize ( this .MATRIX.ROW[i].COL); i++){ ArrayFree ( this .MATRIX.ROW[i].COL); } ArrayFree ( this .MATRIX.ROW);}
   int RowCount() const { return ( ArraySize ( this .MATRIX.ROW)); }
   int ColCount() const { if ( this .RowCount()> 0 ) return ( ArraySize ( this .MATRIX.ROW[ 0 ].COL)); else return ( 0 ); }
   void operator =( const SMatrix &v) { this .Resize(v.RowCount(),v.ColCount()); this .MATRIX = v.MATRIX;}

};

//+------------------------------------------------------------------+
void OnStart ()
{
   SMatrix A( 2 , 5 );
   int count = 0 ;
   for ( int i = 0 ; i < A.RowCount(); i++)
       for ( int j = 0 ; j < A.ColCount(); j++)
         A.MATRIX.ROW[i].COL[j] = count++;
   
   SMatrix C( 5 , 2 );
   count = 100 ;
   for ( int i = 0 ; i < C.RowCount(); i++)
       for ( int j = 0 ; j < C.ColCount(); j++)
         C.MATRIX.ROW[i].COL[j] = count++;

   
   SMatrix B = A;
   for ( int i = 0 ; i < B.RowCount(); i++)
       ArrayPrint (B.MATRIX.ROW[i].COL);
   
   B = C;
   for ( int i = 0 ; i < B.RowCount(); i++)
       ArrayPrint (B.MATRIX.ROW[i].COL);
   
}

matris A'yı, ardından C'yi başlat

önce yeni bir B = A matrisi atayın ve yazdırın, ardından B=C ve yazdırın

2020.04.21 00:35:50.559 tst (EURUSD,H1) 0 1 2 3 4

2020.04.21 00:35:50.559 tst (EURUSD,H1) 5 6 7 8 9

2020.04.21 00:35:50.560 tst (EURUSD,H1) 100 101

2020.04.21 00:35:50.560 tst (EURUSD,H1) 102 103

2020.04.21 00:35:50.560 tst (EURUSD,H1) 104 105

2020.04.21 00:35:50.560 tst (EURUSD,H1) 106 107

2020.04.21 00:35:50.560 tst (EURUSD,H1) 108 109

öz - yapıyı yapıya ve tekrar yapıya sarmanız gerekiyor .... Teknik terim için özür dilerim))))


Not: çözüm iyi, daha az çağrı olması için RowCount() ve ColCount() yöntemlerini RowCount ve ColCount yapısının alanlarıyla değiştirmeniz gerekiyor... ama genel olarak her şey beklendiği gibi çalışıyor

 
Ciddi misin?
 
Алексей Тарабанов :
Ciddi misin?

Ve bunda nesi var, bir kişi 2012'den beri bu sorunu çözüyor, ona karışma, o daha iyi bilir.

 
Sergey Dzyublik :

Ve bunda nesi var, bir kişi 2012'den beri bu sorunu çözüyor, ona karışma, o daha iyi bilir.

düz düşünme

görev, MQL dilinin teknik yeteneklerini bilmektir, böylece böyle bir örnek https://docs.microsoft.com/en-us/archive/msdn-magazine/2018/april/test-run-understanding-lstm- csharp kullanan hücreler

"alnına" takmak mümkündü - şimdi bu görev çözüldü, örneğin tüm işlevlerini bire bir varsayımla taşıyarak: float[][] sonuç --> SMatrix sonucu

 
Igor Makanu :

Bir yol var ve her zamanki gibi çözüm basit:

matris A'yı, ardından C'yi başlat

önce yeni bir B = A matrisi atayın ve yazdırın, ardından B=C ve yazdırın


Not: çözüm iyi, daha az çağrı olması için RowCount() ve ColCount() yöntemlerini RowCount ve ColCount yapısının alanlarıyla değiştirmeniz gerekiyor... ama genel olarak her şey beklendiği gibi çalışıyor

Ne yazık ki, her şey istediğimiz kadar mutlu değil. MQL'de dizileri varsayılan kopyalama operatörünü kullanarak kopyalama konusunda uzun süredir devam eden bir hata var. Bir diziden diğerine yalnızca ArrayCopy öğeleri vardır. Ve son dizinin boyutu kaynakla eşitlenmez (kesilmez). Onlar. Diyelim ki A(10), B(20), o zaman B=A'dan sonra B(20) de olacak, yani. elemanların yarısı A'dan elemanlarla değiştirilecek, geri kalanı aynı kalacak. Bu kesinlikle = operatöründen beklediğiniz şey değildir. Bu nedenle diziler için kendi operatörünüzü yazmanız gerekecektir.

Dürüst olmak gerekirse, bu hatanın zaten düzeltildiğini düşündüm. Ama kontrol ettim - işler hala orada.

 
Alexey Navoykov :

Ne yazık ki, her şey istediğimiz kadar mutlu değil. MQL'de dizileri varsayılan kopyalama operatörünü kullanarak kopyalama konusunda uzun süredir devam eden bir hata var. Bir diziden diğerine yalnızca ArrayCopy öğeleri vardır. Ve son dizinin boyutu kaynakla senkronize edilmez (kesilmez). Onlar. Diyelim ki A(10), B(20), o zaman B=A'dan sonra B(20) de olacak, yani. elemanların yarısı A'dan elemanlarla değiştirilecek, geri kalanı aynı kalacak. Bu kesinlikle = operatöründen beklediğiniz şey değildir. Bu nedenle diziler için kendi operatörünüzü yazmanız gerekecektir.

Dürüst olmak gerekirse, bu hatanın zaten düzeltildiğini düşündüm. Ama kontrol ettim - işler hala orada.

Hatadan yakın zamanda bahsedildi:

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

MQL5'te OOP hakkında sorular

Sergey Dzyublik , 2020.04.18 17:48

Ardından, terminolojinize göre, varsayılan atama operatörünü çağırmak "eksik veri türü" verebilir.
2019.05.03 tarihli hata hala düzeltilmedi: https://www.mql5.com/en/forum/1111/page2451#comment_11556395


Yukarıdaki satır, fikre göre, hatayı atlamalıdır:

 struct SMatrix
{
   struct SMATRIX{
   SMATRIX(){}
   struct SRow{ int COL[];};
   SRow ROW[];
   };
   SMATRIX MATRIX;
   SMatrix(){}
   SMatrix( const int rows, const int cols){ this .Resize(rows,cols); }
   void Resize( const int rows, const int cols){ ArrayResize ( this .MATRIX.ROW,rows); for ( int i= 0 ;i<rows; i++){ ArrayResize ( this .MATRIX.ROW[i].COL,cols); }}
   void Free() { for ( int i= 0 ;i< ArraySize ( this .MATRIX.ROW[i].COL); i++){ ArrayFree ( this .MATRIX.ROW[i].COL); } ArrayFree ( this .MATRIX.ROW);}
   int RowCount() const { return ( ArraySize ( this .MATRIX.ROW)); }
   int ColCount() const { if ( this .RowCount()> 0 ) return ( ArraySize ( this .MATRIX.ROW[ 0 ].COL)); else return ( 0 ); }
   void operator =( const SMatrix &v) { this .Resize(v.RowCount(),v.ColCount()); this .MATRIX = v.MATRIX;}

};
 
Sergey Dzyublik :

Yukarıdaki satır, fikre göre, hatayı atlamalıdır:

Ah, evet, hemen bir şey fark etmedim... Ama sonra hemen ArrayCopy yazmak mümkün oldu. O zaman neden bu SMATRIX contaya ihtiyacınız var? ..

 
Alexey Navoykov :

Ah, evet, hemen bir şey fark etmedim... Ama sonra hemen ArrayCopy yazmak mümkün oldu. O zaman neden bu SMATRIX contaya ihtiyacınız var? ..

MT geliştiricileri her zaman yerleşik derleyici mekanizmalarını kullanmanın normal işlevleri çağırmaktan bile daha hızlı olacağını yazar.

zamanınız ve ilginiz varsa, benim ve sizinkinin hızını ArrayCopy ile kontrol edin.

Hızı biraz sonra kontrol edeceğim, şimdi bilgisayar derslerle meşgul