Yapınızı CObject'i miras alan bir sınıf olarak yazmanız ve kendi karşılaştırma yönteminizi Karşılaştırmanız, ardından CArrayObj kullanmanız gerekir . Bu en hızlı seçenek olacaktır.
Ve burada ArraySwap hakkında - https://www.mql5.com/ru/docs/array/arrayswap MT4 için böyle bir fonksiyon yazmak zor olmamalı.
Yapınızı CObject'i miras alan bir sınıf olarak yazmanız ve kendi Karşılaştırma yönteminizi yazmanız, ardından CArrayObj kullanmanız gerekir. Bu en hızlı seçenek olacaktır.
Ve burada ArraySwap hakkında - https://www.mql5.com/ru/docs/array/arrayswap MT4 için böyle bir fonksiyon yazmak zor olmamalı.
Bu bilgiyi okudum.
Basit bir diziden değil, bir dizi yapıdan bahsediyoruz.
Ve CArrayObj basit bir dizi mi?
Hayır, FKÖ ile dostane ilişkilerim olmadı.
@fxsaber'ın sürümü en hızlısı olacak çünkü derleyici makro ikamelerini tam koda genişletecek
kod tekrarı olmaması için, fonksiyonda gerekli alanlara göre gerekli sıralamayı sarın ve kullanın
ve CObject'ten miras alınan seçenekler birçok kez daha yavaş olacak ve karşılık gelen Karşılaştırma yöntemlerini eklemek için sürekli bir ihtiyaç olacaktır.
@fxsaber'ın sürümü en hızlısı olacak çünkü derleyici makro ikamelerini tam koda genişletecek
kod tekrarı olmaması için, fonksiyonda gerekli alanlara göre gerekli sıralamayı sarın ve kullanın
ve CObject'ten miras alınan seçenekler birçok kez daha yavaş olacak ve karşılık gelen Karşılaştırma yöntemlerini eklemek için sürekli bir ihtiyaç olacaktır.
Orada, verileri bir diziden diğerine kopyalamak, ardından endeksleri yeniden düzenlemek. Belki ArraySort() kullanarak daha hızlı olabilir.
Ancak böyle bir seçenek, işlevi yapınıza uyacak şekilde değiştirmektir:
#property copyright "Copyright 2017, MetaQuotes Software Corp." #property link "https://www.mql5.com" #property version "1.00" #property strict struct SMy{ int x1; int x2; }; SMy s[ 3 ]={{ 4 , 44 },{ 2 , 22 },{ 3 , 33 }}; //+------------------------------------------------------------------+ //| Script program start function | //+------------------------------------------------------------------+ void OnStart (){ SortHoareUp(s); for ( int i= 0 ;i< 3 ;i++){ Alert (s[i].x1, " " ,s[i].x2); } } void SortHoareUp(SMy &aAr[]) { HoareUp(aAr, 0 , ArraySize (aAr)- 1 ); } void HoareUp(SMy &aAr[], int aLeft, int aRight) { SMy tmp; int i=aLeft; int j=aRight; int xx=aAr[(aLeft+aRight)/ 2 ].x1; // int заменить на тип поля по которому выполняется сравнение do { while (i<aRight && aAr[i].x1<xx)i++; while (j>aLeft && xx<aAr[j].x1)j--; if (i<=j) { tmp=aAr[i]; aAr[i]=aAr[j]; aAr[j]=tmp; i++; j--; } } while (i<=j); if (aLeft<j)HoareUp(aAr,aLeft,j); if (i<aRight)HoareUp(aAr,i,aRight); }
Ancak CObjArray ile
#property copyright "Copyright 2017, MetaQuotes Software Corp." #property link "https://www.mql5.com" #property version "1.00" #property strict #include <Arrays/ArrayObj.mqh> class CMyClass: public CObject{ public : int x1; int x2; int x3; CMyClass( int ax1, int ax2, int ax3){ x1=ax1; x2=ax2; x3=ax3; } int Compare( const CObject *node, const int mode= 0 ) const { const CMyClass * t=node; if (mode== 0 && t.x1> this .x1){ return ( 1 ); } if (mode== 1 && t.x1< this .x1){ return ( 1 ); } return (- 1 ); } }; CMyClass * tmp; CArrayObj a; //+------------------------------------------------------------------+ //| Script program start function | //+------------------------------------------------------------------+ void OnStart (){ a.Add( new CMyClass( 1 , 11 , 111 )); a.Add( new CMyClass( 2 , 22 , 222 )); a.Add( new CMyClass( 3 , 33 , 333 )); Alert ( "===" ); Al( 1 ); a.Sort( 0 ); Al( 2 ); a.Sort( 1 ); Al( 3 ); } //+------------------------------------------------------------------+ void Al( int n){ Alert ( "-" +( string )n+ "-" ); for ( int i= 0 ;i<a.Total();i++){ tmp=a.At(i); Alert (tmp.x1, " " ,tmp.x2, " " ,tmp.x3); } }
Ancak böyle bir seçenek, işlevi yapınıza uyacak şekilde değiştirmektir:
hiç bir seçenek değil - bu belirli bir soruna ortak bir çözümdür, bu tür çözümlerin sonraki kullanım için taşınabilirliği sıfırdan yazmakla orantılı olacaktır)))
ilk mesajdaki kod kopyalanarak aktarılır eğer görev kodun 2 - 3 yerinde sıralama yapmak ise
ya da yukarıda önerdiğim gibi, kodun farklı bölümlerinde farklı yapı alanlarına göre sıralamanın sık kullanılması bekleniyorsa, önerilen makro için sarmalayıcı işlevler yapmak daha iyidir.
Not: Microsoft web sitesinde tüm temel sınıflara sahip C# kaynakları, sıralamalar var ve SB'deki arayüzlere benziyorlar ama ne yazık ki SB'yi bitirmediler - kendin yap dediler;)
hiç bir seçenek değil - bu belirli bir soruna ortak bir çözümdür, bu tür çözümlerin sonraki kullanım için taşınabilirliği sıfırdan yazmakla orantılı olacaktır)))
ilk mesajdaki kod kopyalanarak aktarılır eğer görev kodun 2 - 3 yerinde sıralama yapmak ise
ya da yukarıda önerdiğim gibi, kodun farklı bölümlerinde farklı yapı alanlarına göre sıralamanın sık kullanılması bekleniyorsa, önerilen makro için sarmalayıcı işlevler yapmak daha iyidir.
Not: Microsoft web sitesinde tüm temel sınıflara sahip C# kaynakları, sıralamalar var ve SB'deki arayüzlere benziyorlar ama ne yazık ki SB'yi bitirmediler - kendin yap dediler;)
Bir yerde, değişkenin türünü değiştirin ve derleyici diğer üçünde hatalar gösterecektir - alanın adını değiştirin. Onlarca yapının tasnif gerektirdiğini bir yerde düşünmek mümkündür. Evet, büyük olasılıkla bir yapı sıralama gerektirir.
- Ücretsiz ticaret uygulamaları
- İşlem kopyalama için 8.000'den fazla sinyal
- Finansal piyasaları keşfetmek için ekonomik haberler
Gizlilik ve Veri Koruma Politikasını ve MQL5.com Kullanım Şartlarını kabul edersiniz
Herkese merhaba fxsaber tarafından yazılmış bir fonksiyon var
MT 5'te sorunsuz çalışıyor MT 4'te sorunsuz çalışıyor, Mql 4 desteklemediği için ArraySwap'a yemin ediyor...
Belki birisinin hem mt 5 hem de mt 4'te çalışan bir dizi yapıyı evrensel olarak sıralama seçenekleri vardır?
Ayrıca en hızlı uygulama için 10$'lık bir ödül de verebilirim.