MQL5'te OOP hakkında sorular - sayfa 88

 
Igor Makanu :
aynı değerler, bir nedenden dolayı testin hızı "yüzer", ancak yöntemlerde referans olarak parametreleri geçmek hala daha verimli

Sonra başka bir seçenek:

 class E
{
   double f1( double a, double b )  { return (a + 1.0 /( 1.0 +( double ) rand ())); }
   double f2( double a, double b )  { return (b + 1.0 /( 1.0 +( double ) rand ())); }
   double f3( double a, double b )  { return (a/b + 1.0 /( 1.0 +( double ) rand ())); }
   
public :
   double calc( const MqlTick & tick )
   {
       return f1( tick.ask, tick.bid ) + f2( tick.ask, tick.bid ) + f3( tick.ask, tick.bid );
   }
};
 
Koldun Zloy :

Sonra başka bir seçenek:

2020.07.26 10:10:52.254 class_global (EURUSD,H1) A sınıfı : : döngüler = 10000000000 ms=46141

2020.07.26 10:11:30.261 class_global (EURUSD,H1) B sınıfı : : döngüler = 10000000000 ms=38000

2020.07.26 10:12:08.258 class_global (EURUSD,H1) C sınıfı : : döngüler = 10000000000 ms=38000

2020.07.26 10:12:46.254 class_global (EURUSD,H1) D sınıfı : : döngüler = 10000000000 ms=38000

2020.07.26 10:13:24.279 class_global (EURUSD,H1) E sınıfı : : döngüler = 10000000000 ms=38031

2020.07.26 10:14:10.484 class_global (EURUSD,H1) A sınıfı : : döngüler = 10000000000 ms=46203

2020.07.26 10:14:48.570 class_global (EURUSD,H1) B sınıfı : : döngüler = 10000000000 ms=38078

2020.07.26 10:15:26.737 class_global (EURUSD,H1) C sınıfı : : döngüler = 10000000000 ms=38172

2020.07.26 10:16:04.734 class_global (EURUSD,H1) D sınıfı : : döngüler = 10000000000 ms=38000

2020.07.26 10:16:42.739 class_global (EURUSD,H1) E sınıfı : : döngüler = 10000000000 ms=38000

2020.07.26 10:17:28.886 class_global (EURUSD,H1) A sınıfı : : döngüler = 10000000000 ms=46141

2020.07.26 10:18:06.894 class_global (EURUSD,H1) B sınıfı : : döngüler = 10000000000 ms=38015

2020.07.26 10:18:44.888 class_global (EURUSD,H1) C sınıfı : : döngüler = 10000000000 ms=38000

2020.07.26 10:19:22.948 class_global (EURUSD,H1) D sınıfı : : döngüler = 10000000000 ms=38047

2020.07.26 10:20:00.983 class_global (EURUSD,H1) E sınıfı : : döngüler = 10000000000 ms=38047

garip ama fark yok

UPD: yanılmıyorsam, yıllar önce MT4'te bir hata arıyordum - DEĞİL işlevine referans olarak argümanlar ilettim ve sonra işlev gövdesinde işlevin argümanlarından birini değiştirdim (karıştırdım), bu nedenle referansla değil iletilen argümanı değiştirmek mümkündü, belki E seçeneğinde olabilir, derleyici tüm argümanları referansla iletir

 
Igor Makanu :
garip ama fark yok

Garip bir şey yok. çift - 8 bayt, bağlantı da 8 bayttır. Ancak bağlantının hala sayının 8 baytını alması gerekiyor.

 
Koldun Zloy :

Garip bir şey yok. çift - 8 bayt, bağlantı da 8 bayttır. Ancak bağlantının hala sayının 8 baytını alması gerekiyor.

bu yüzden mantıklı ve sayılar orada 8 ve geri 8'de birleşiyor))

ama veri yolu işlemci için 8 bit değil mi? 8 bayt = döngü başına 64 bit okumalı mı?

 
Igor Makanu :

bu yüzden mantıklı ve sayılar orada 8 ve geri 8'de birleşiyor))

ama veri yolu işlemci için 8 bit değil mi? 8 bayt = döngü başına 64 bit okumalı mı?

Her şey o kadar basit değil. Hız ayrıca nesnenin hangi bellekte olduğuna ve diğer nedenlere de bağlıdır.

Gerçek bir programda, sonuç basit bir testin sonucundan çok farklı olabilir.

Sınıflar ve yapılar genellikle referans yoluyla iletilir.

Basit türler, yalnızca içinden bir değer döndürülürse başvuru yoluyla iletilir.

 

bir fonksiyonun sonucu olarak bu yapı döndürülse bile bir yapının alanlarına erişilebildiğini öğrenince şaşırdım.

bu kod doğru çalışıyor (fonksiyondaki yapıyı doldurun, ardından fonksiyonun sonucunu bayt dizisine kopyalayın)

 struct UcharArray
{
   uchar              byte[];
};
//+------------------------------------------------------------------+
UcharArray f()
{
   UcharArray result;
   for ( uchar i = 0 ; i < 10 ; i++)
   {
       uchar tmp[ 1 ];
      tmp[ 0 ] = i;
       ArrayCopy (result.byte, tmp, ArraySize (result.byte));
   }
   return result;
}
//+------------------------------------------------------------------+
void OnStart ()
{
   uchar arr[];
   for ( int i = 0 ; i < 3 ; i++)
   {
       ArrayCopy (arr, f().byte , ArraySize (arr));
   }
   
   ArrayPrint (arr); // 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9

}
//+------------------------------------------------------------------+

yapı alanına böyle bir erişimi kullanmak oldukça uygundur, .... nerede tuzaklar olabilir - hatalar / hatalar?

 
Igor Makanu :

bir fonksiyonun sonucu olarak bu yapı döndürülse bile bir yapının alanlarına erişilebildiğini öğrenince şaşırdım.

bu kod doğru çalışıyor (fonksiyondaki yapıyı doldurun, ardından fonksiyonun sonucunu bir bayt dizisine kopyalayın)

yapı alanına böyle bir erişimi kullanmak oldukça uygundur, .... nerede tuzaklar olabilir - hatalar / hatalar?

Bu tip çip)) hata yok.

 ArrayCopy (arr, (f()).byte, ArraySize (arr))

Yani operadan daha doğru (.)(.)

Ayrıca bir bayt dizisine kopyalamanın bununla ne ilgisi olduğunu anlamadım. Hemen, sadece döndürülen yapının verilerine erişme
 
Alexandr Andreev :
Hemen, sadece döndürülen yapının verilerine erişme

evet, ancak f() işlevinin sonucuna bir ara değişken olmadan bayt alanına erişmem utanç verici

bu yüzden bunun bir hilesini bekliyorum

f().byte
 
Igor Makanu :

evet, ancak f() işlevinin sonucuna bir ara değişken olmadan bayt alanına erişmem utanç verici

bu yüzden bunun bir hilesini bekliyorum

birkaç yıldır istikrarlı

 
Alexandr Andreev :

birkaç yıl boyunca istikrarlı

Tamam teşekkürler!

Neden: