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

 
TheXpert :

peki anlamı? birkaç bayt hafızadan tasarruf edin? özellikle double ile diğer sayılar elde edilecektir (== yanlış olacaktır)

Anlamı yok. Tasarımını beğendim, daha önce görmemiştim.

 
fxsaber :

Anlamı yok. Tasarımını beğendim, daha önce görmemiştim.

Ah tamam. xor aracılığıyla daha zarif, IMHO

 
TheXpert :

Ah tamam. xor aracılığıyla daha zarif, IMHO

Kabul ediyorum

 #define SWAP(A, B) { A ^= B; B ^= A; A ^= B; }


not

 #define SWAP(A, B) A ^= (B ^= (A ^= B));


Wiki'den

Bununla birlikte, modern CPU'larda XOR tekniği, takas için geçici bir değişken kullanmaktan önemli ölçüde daha yavaştır. Bunun nedeni, komut yürütmenin paralelleştirilmesidir. XOR tekniğinde, tüm talimatların işlenenleri önceki talimatların sonuçlarına bağlıdır, bu nedenle kesinlikle sıralı sırayla yürütülmeleri gerekir. Her özel durumda, hedef mimaride her iki alternatifin hızlarının test edilmesi önerilir.

 
Kabus.
 
fxsaber :

Wiki'den

ve önceki eklemeler/çıkarmalar paralelleştirilirse? )

 
Taras Slobodyanik :

ve önceki eklemeler/çıkarmalar paralelleştirilirse? )

Eylemlerin sırasına bağlı olan bir algoritma paralelleştirilmez.

Geçici değişkenli algoritma böyle değildir, bu yüzden paralelleştirilmiştir.

 
Hayır...
 

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

Hatalar, hatalar, sorular

İlyas , 2016.08.24 11:08

Dizi ("inside"), ayrılan - dizinin kaç öğenin altında ayrıldığını saklar.

Yedekle çalışmanın mantığı (koşullu kod):
 ArrayResize (arr, int size, int reserve)
  {
   if (arr.allocated<size)
       if (!ArrayAllocateMemory(arr,size+reserve))   // -> arr.allocated=size+reserve;
         return (- 1 );
   //---
   CallConstructorsOrDestructors(arr,size);
   //---
   arr.size=size;
   return (size);
  }
 

"Çılgın eller" başlığımıza devam ediyoruz. Bugünkü programın konusu, kalıp ateşi veya kendinizi kıçınızdaki bir kalıptan nasıl kurtaracağınızdır)

Çoğu zaman, bazı değişkenleri değiştirmek için referans olarak bir şablon argümanı olarak iletmeye ihtiyaç vardır. Bununla birlikte, şablon belirtimi, ne yazık ki, sıradan işlevlerde olduğu gibi, bir bağımsız değişkenin değişmezliğini açıkça belirtmenize izin vermez:

 void Modify( int &) { }   // Принимает только не константы

template < typename T>
void Modify(T& a) {  }  // Принимает любые аргументы

Ve bu, argüman şablon zinciri boyunca hedefe gittiğinde rahatsızlığa neden olabilir ve orada bunun sabit olduğu ve değiştirilemeyeceği ortaya çıktı. Ve bu hata, kütüphanelerin bağırsaklarında bir yerde meydana gelir. Orijinal şablonun nereden çağrıldığını bulmak bazen çok zor bir iştir.

 template < typename T>
void f0(T& a)  { a= 10 ; }   // 'a' - constant cannot be modified

template < typename T>
void f1(T& a)  { f0(a); }

template < typename T>
void f2(T& a)  { f1(a); }

void Source() { const int a= 0 ;  f2(a); }

Normal IDE'lerde bu bir sorun değildir. Örneğin, VS bir şablon rotanın tam izini görüntüler, bu nedenle doğru yere tıklamanız yeterlidir ve hemen doğru yere ulaşırsınız. Ancak MQL'de bir sorun var. Bu, kalıp yapımcısı için sürekli bir baş ağrısı haline gelebilir.

Ama düzelteceğiz. Bunu yapmak için şablon aşırı yüklemesini kullanabilirsiniz:

 template < typename T>
void Modify( const T&);  // Фэйковый запрещённый шаблон

template < typename T>
void Modify(T& a) { a=10; }

Şimdi, bir sabiti geçmeye çalışırken üst şablon çağrılacak. Dan beri tanımlı değil, bir hata atılır. Ancak bu yetersiz bir çözümdür, çünkü ilk olarak, hata yalnızca yürütülebilir modülü derlerken (.mqh'de yayınlanmaz) oluşur ve ikincisi, bu hata şablon bildiriminin yerinde değil, şablon bildiriminin yerinde oluşur. keşfetmek istediğimiz çağrı. Öyleyse devam edelim.

Şablonun sınıf metodu olması durumunda ise her şey basit: Sahte şablonu özel bir bölüme koyuyoruz ve onu çağırmaya çalıştığımızda erişim hatası alıyoruz.

Sıradan bir işlev durumunda, daha zordur. C++'da bu görev yalnızca aşırı yüklemelerle çözülemez; MQL'de mevcut olmayan ek işlevsellik gereklidir. Ama burada güçlü bir MQL silahı yardımımıza geliyor - böcekler! ) Bu durumda bu buglardan biri çok işimize yarar )
Sahte şablonumuza ek bir T2 parametresi ekliyoruz. Ve şimdi, yanlış şablonu aramaya çalışırken, arama yerinde bir hata alıyoruz:

 template < typename T, typename T2 >
void Modify( const T&);   // Запрещаем

template < typename T>
void Modify(T& a) { a=10; }

void Source()
{ 
   int a, const b= 0 ;
  Modify(a);   // всё ОК
  Modify(b);   // template mismatch
}

Sorun çözüldü. C++'da, elbette, her iki durumda da alttaki şablon çağrılır, çünkü böyle bir bug yok.

Bu yöntem bir durumda daha yararlı olabilir: örtük dökümü yasaklayarak işlev argümanlarının türlerini açıkça kontrol etmeniz gerekiyorsa.
Örneğin, işlev yalnızca bir tarih-saat bağımsız değişkenini kabul etmeli, her türlü girişi vb. engellemelidir.
İlgili seçeneği yapıyoruz:

 template < typename T, typename T2>
void MyFunc(T);   // Запрещаем

void MyFunc( datetime time) {  }

Şimdi, önceki durumda olduğu gibi, çözülmemiş bir türü geçmeye çalışırsanız, bir derleme hatası üretilecektir.

Bu arada datetime için her zaman böyle bir yasak yapıyorum. Geliştiricilerin genellikle örtük olarak ve hatta herhangi bir derleyici uyarısı olmadan (uzun ve dize hariç) dolaylı olarak yayınlanmasına izin vermelerinin boşuna olduğunu düşünüyorum. Herhangi bir numaralandırma bile uyarılmadan serbestçe getirilir.

Ters bir görev de vardır: yalnızca belirli bir türdeki aramayı yasaklamak. Çözüm benzer olacaktır:

 template < typename T, typename T2>
void MyFunc( datetime );   // Запрещаем

template < typename T>
void MyFunc(T arg) {  }


Yukarıda belirtildiği gibi, sınıf içinde her şeye gereksiz parametreler olmadan karar verilir.

 
Alexey Navoykov :

"Çılgın eller" başlığımıza devam ediyoruz. Bugünkü programın konusu, kalıp ateşi veya kendinizi kıçınızdaki bir kalıptan nasıl kurtaracağınızdır)

Çoğu zaman, bazı değişkenleri, onu değiştirmek için referans yoluyla bir şablon argümanı olarak iletmek gerekir .

Hız veya bir nesne için değişiklik yapılmadan referans olarak geçme ihtiyacı vardır.

Ancak, mevcut C++ şablon belirtimi, ne yazık ki, normal işlevlerde olduğu gibi, bağımsız değişkenin const olmayanını açıkça belirtmenize izin vermiyor:

Ve bu, argüman şablon zinciri boyunca hedefe gittiğinde rahatsızlığa neden olabilir ve orada bunun sabit olduğu ve değiştirilemeyeceği ortaya çıktı. Ve bu hata, kütüphanelerin bağırsaklarında bir yerde meydana gelir. Orijinal şablonun nereden çağrıldığını bulmak bazen çok zor bir iştir.

Bu sorun oluştuğunda MQL5'te gerçek bir örnek var mı?

Normal IDE'lerde bu bir sorun değildir. Örneğin, VS bir şablon rotanın tam izini görüntüler, bu nedenle doğru yere tıklamanız yeterlidir ve hemen doğru yere ulaşırsınız. Ancak MQL'de bir sorun var. Bu, kalıp yapımcısı için sürekli bir baş ağrısı haline gelebilir.

Ama düzelteceğiz. Bunu yapmak için şablon aşırı yüklemesini kullanabilirsiniz:

Şimdi, bir sabiti geçmeye çalışırken üst şablon çağrılacak. Dan beri tanımlı değil, bir hata atılır. Ancak bu yetersiz bir çözümdür, çünkü ilk olarak, hata yalnızca yürütülebilir modülü derlerken (.mqh'de yayınlanmaz) oluşur ve ikincisi, bu hata şablon bildiriminin yerinde değil, şablon bildiriminin yerinde oluşur. keşfetmek istediğimiz çağrı. Öyleyse devam edelim.

Şablonun sınıf metodu olması durumunda ise her şey basit: Sahte şablonu özel bir bölüme koyuyoruz ve onu çağırmaya çalıştığımızda erişim hatası alıyoruz.

Sıradan bir işlev durumunda, daha zordur. Sözdizimsel olarak C++'da bu görev, anladığım kadarıyla hiç çözülemez. Ancak burada MQL'nin C++ olmadığı gerçeğiyle kurtuluyoruz. Hataları var) Ve bu durumda, bu hatalar iyi için sarılabilir)

Sahte şablonumuza ek bir T2 parametresi ekliyoruz. Ve şimdi, yanlış şablonu aramaya çalışırken, arama yerinde bir hata alıyoruz:

Sorun çözüldü. C++'da elbette her iki durumda da alttaki şablon çağrılır.

Gerçek bir kolaylık örneği eksik.

Bu yöntem bir durumda daha yararlı olabilir: örtük dökümü yasaklayarak işlev argümanlarının türlerini açıkça kontrol etmeniz gerekiyorsa.
Örneğin, işlev yalnızca bir tarih-saat bağımsız değişkenini kabul etmeli, her türlü girişi vb. engellemelidir.
İlgili seçeneği yapıyoruz:

Şimdi, önceki durumda olduğu gibi, çözülmemiş bir türü geçmeye çalışırsanız, bir derleme hatası üretilecektir.

Fırsat ortaya çıkar çıkmaz MQL5'te güçlü ve ana ile birlikte kullanılıyor gibi görünüyor. Doğru anladıysam standart bu.

Bu arada datetime için her zaman böyle bir yasak yapıyorum. Geliştiricilerin genellikle örtük olarak ve hatta herhangi bir derleyici uyarısı olmadan (uzun ve dize hariç) dolaylı olarak yayınlanmasına izin vermelerinin boşuna olduğunu düşünüyorum. Herhangi bir numaralandırma bile uyarılmadan serbestçe getirilir.

Ters bir görev de vardır: yalnızca belirli bir türdeki aramayı yasaklamak. Çözüm benzer olacaktır:

Datetime sahip olmanın rahatlığını hissetmek, şimdi olduğu gibi davranmak. Sorun ne zaman?


Hepsi bir arada çok güzel bir yazı, teşekkürler!