İşlev - Bir dizi yapıyı sıralama yöntemi. Ödül 10$

 

Herkese merhaba fxsaber tarafından yazılmış bir fonksiyon var

 template < typename T>                                       
void ArrayReindex( T &Array[], const double &TmpSort[][ 2 ] )
{                         
  T TmpArray[];
  
   for ( int x = :: ArrayResize (TmpArray, :: ArrayRange (TmpSort, 0 )) - 1 ; x >= 0 ; x--)
    TmpArray[x] = Array[( int )(TmpSort[x][ 1 ] + 0.1 )];
    
  :: ArraySwap (Array, TmpArray);
              
   return ;     
}             

// Сортировка массива структур и указателей на объекты по (под-) полю/методу.
#define ArraySortStruct(ARRAY, FIELD)                                      \
{                                                                          \
   double TmpSort[][ 2 ];                                                     \
                                                                           \
   for ( int x =:: ArrayResize (TmpSort, :: ArraySize (ARRAY)) - 1 ; x >= 0 ; x--) \
  {                                                                        \
    TmpSort[x][ 0 ] = ( double )ARRAY[x].FIELD;                                \
    TmpSort[x][ 1 ] = x;                                                     \
  }                                                                        \
                                                                           \
  :: ArraySort (TmpSort);                                                    \
  ::ArrayReindex(ARRAY, TmpSort);                                          \
}                                  


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.

Документация по MQL5: Операции с массивами / ArraySort
Документация по MQL5: Операции с массивами / ArraySort
  • www.mql5.com
//| Получение значений границ для тиковых объемов                    | //| Custom indicator initialization function                         | //| Custom indicator iteration function                              | //
 

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ı.

 
Dmitry Fedoseev :

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.

 
Vladimir Pastushak :

Bu bilgiyi okudum.

Basit bir diziden değil, bir dizi yapıdan bahsediyoruz.

Ve CArrayObj basit bir dizi mi?

 
Dmitry Fedoseev :

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.

 
Igor Makanu :

@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);
   }   
}
 
Dmitry Fedoseev :

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;)

 
Igor Makanu :

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.

Neden: