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

 
Dmitry Fedoseev :

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.

hayır, görevi yanlış yap

ve aşağıdaki görevi belirleyin: örneğinizi kullanarak, her alan için düzinelerce alana sahip bir yapıyı sıralayın

peki ve özel bir örnek - "dört" sıranın (OrderStoploss(), OrderTakeProfit(), OrderOpenTime()...) tüm özelliklerini içeren bir yapı olsun - yaklaşık bir düzine olacak

ve her alan için bu tür yapıların bir dizisini örneklerinizle yeniden üretin mi? - IMHO, kodunuz oldukça iyi tartılacak, böyle bir kodu tekrar kullanmanın mümkün olmayacağı konusunda yukarıda yazdım.

 
Igor Makanu :

hayır, görevi yanlış yap

ve aşağıdaki görevi belirleyin: örneğinizi kullanarak, her alan için düzinelerce alana sahip bir yapıyı sıralayın

peki ve özel bir örnek - "dört" sıranın (OrderStoploss(), OrderTakeProfit(), OrderOpenTime()...) tüm özelliklerini içeren bir yapı olsun - yaklaşık bir düzine olacak

ve her alan için bu tür yapıların bir dizisini örneklerinizle yeniden üretin mi? - IMHO, kodunuz oldukça iyi tartılacak, böyle bir kodu tekrar kullanmanın mümkün olmayacağı konusunda yukarıda yazdım.

Pratikte hiç karşılaşılmayan, fantezi dünyasından bir görev.

Sıralamak için ayrı bir alan oluşturabilir ve sıralamadan önce sıralamak istediğiniz alandan kopyalayabilirsiniz.

 
Vladimir Pastushak :

MT 5'te sorunsuz çalışıyor MT 4'te sorunsuz çalışıyor, Mql 4 desteklemediği için ArraySwap'a yemin ediyor...

 #ifndef __MQL5__
   template < typename T>
   void ArraySwap ( T &Array1[], T &Array2[] )
  {
    T ArrayTmp[];

     ArrayCopy (ArrayTmp, Array1);
     ArrayFree (Array1);

     ArrayCopy (Array1, Array2);

     ArrayFree (Array2);
     ArrayCopy (Array2, ArrayTmp);

     return ;
  }
#endif // __MQL5__
 
Dmitry Fedoseev :

Fantezi dünyasından bir görev.

evet hayır, belki MQL aracılığıyla, tam önerdiğiniz gibi, SB kullanıyorum

ancak sorun, bu kodun belirli bir görev için yazılması olacaktır.

peki, örneklerde - MQL penceresi şeklinde siparişlerle terminal panelini yeniden ürettilerse, sıralamayı yaptılar, her şey dönüyor, her şey çalışıyor

ancak "optimizasyon" test cihazı panelini yeniden oluşturmak için kodun bir kısmını kullanmak istiyorsunuz ve bir arabayı bir araba ile düzenlemeyi elde edeceksiniz, yeniden daha kolay, esasen sıralama dahil olmak üzere sıfırdan kod yazmak, sahip olmak ister misiniz? okunabilir bir biçimde yapıların alanlarının adları? - aksi takdirde, Abyrvalg (Köpeğin kalbi) biçimindeki tüm tanımlayıcı adlarını akılda tutmak için iyi bilinen bir "çekirdeğin" yazarı olmanız gerekir.

)))

 
Igor Makanu :

evet hayır, belki MQL aracılığıyla, tam önerdiğiniz gibi, SB kullanıyorum

ancak sorun, bu kodun belirli bir görev için yazılması olacaktır.

peki, örneklerde - MQL penceresi şeklinde siparişlerle terminal panelini yeniden ürettilerse, sıralamayı yaptılar, her şey dönüyor, her şey çalışıyor

ancak "optimizasyon" test cihazı panelini yeniden oluşturmak için kodun bir kısmını kullanmak istiyorsunuz ve bir arabayı bir araba ile düzenlemeyi elde edeceksiniz, yeniden daha kolay, esasen sıralama dahil olmak üzere sıfırdan kod yazmak, sahip olmak ister misiniz? okunabilir bir biçimde yapıların alanlarının adları? - aksi takdirde, Abyrvalg (Köpeğin kalbi) biçimindeki tüm tanımlayıcı adlarını akılda tutmak için iyi bilinen bir "çekirdeğin" yazarı olmanız gerekir.

)))

Yanlış anlaşılabilecek her şey yanlış anlaşılacaktır. Aklında olasılık/imkansızlık değil, bunun için pratik ihtiyaç, yani bu görevin gerçekleşmesi vardı.

Her yapı için kendi Karşılaştırmanızı () yazmanız gerektiği fikrini bulmadım.

 

ve farklı alanlardaki kalın yapılardan oluşan bir diziyi/vektörü sıralamak için ne var?

olduğu gibi yatmasına izin verin, const :-) bile olma hakkına sahiptir ve farklı amaçlar için dizinler oluşturabilirsiniz

 /// код не проверял - написал "с руки", демонстрировать идею
template < typename T>
int
ArrayIndexate( const T &arr[], int &index[], int (*compare)( const T&, const T&))
{
   /// инициализуем индексный массив
   int size= ArraySize (arr);
   if (size==- 1 || ArrayResize (index,size)==- 1 ) {
       return - 1 ;
   }
   for ( int i= 0 ;i<size;i++)
      index[i]=i;
   /// "пузырёк" - замените более быстрым методом
   for ( int i= 0 ;i<size;i++) {
       for ( int j=i+ 1 ;j<size;j++) {
         if ( compare(arr[index[i]],arr[index[j]] ) > 0 ) {
             int swap=index[i];
            index[i]=index[j];
            index[j]=swap;
         }
      }
   }
   // в массиве index[] теперь лежат индексы элементов arr[]
   return size;   
}
 
Dmitry Fedoseev :

Her yapı için kendi Karşılaştırmanızı () yazmanız gerektiği fikrini bulmadım.

tam olarak bu, daha doğrusu başka bir yol bilmiyorum ve bu yöntem belirli bir göreve bağlı olacak

ve topikstarter 10 dolar için evrensel bir çözüm istiyor, peki, bekleyelim ve aniden bir şeyler netleşecek

 
Maxim Kuznetsov :

ve farklı alanlardaki kalın yapılardan oluşan bir diziyi/vektörü sıralamak için ne var?

olduğu gibi yatmasına izin verin, const :-) bile olma hakkına sahiptir ve farklı amaçlar için dizinler oluşturabilirsiniz

Şimdi birisi yazacak... o kadar rahatsızım ki... ev hanımları değiliz, süper geliştiriciler ve modern programlama teknolojilerinin tüm olanaklarını kullanmamız gerekiyor ve ek bir dizi bir tür Orta Çağ...

Şahsen ben bu seçeneği daha çok beğeniyorum.

 #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 }};
double sa[][ 2 ];

//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart (){
   int size= ArraySize (s);
   ArrayResize (sa,size);
   for ( int i= 0 ;i<size;i++){
      sa[i][ 0 ]=s[i].x1; // поле по которому сортировать
      sa[i][ 1 ]=i;
   }
   ArraySort (sa);
   
   Alert ( "===" );
   for ( int i= 0 ;i<size;i++){
       int ii=( int )sa[i][ 1 ];
       Alert (s[ii].x1, " " ,s[ii].x2);
   }
   
}

 
fxsaber :

Gitmeyecek:
1) ArrayCopy'yi ArraySwap'a değil, koşullu derlemeye eklemek yeterlidir.
2) Standart olan, NonPod yapılarını desteklemediğinden ArrayCopy özel olmalıdır.
3) ArrayResize çoklu alan dizisi için bir koşullu derlemeye daha ihtiyacınız var (işlev, MT'nin farklı sürümleri için farklı sonuçlar verir)

 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);                                          \
}  
 
Sergey Dzyublik :

Gitmeyecek:

Cevap her durum için değildi. Çoğu kapalı.