Funktion - Methode zum Sortieren eines Arrays von Strukturen. Preis 10$ - Seite 2

 
Dmitry Fedoseev:

Ändern Sie den Variablentyp an einer Stelle, zeigt der Compiler an den anderen drei Stellen Fehler an - ändern Sie den Feldnamen. Man könnte meinen, es gäbe Dutzende von Strukturen, die sortiert werden müssen. Ja, eine Struktur muss höchstwahrscheinlich sortiert werden.

Nein, stellen Sie die Aufgabe nicht auf diese Weise ein

stellen Sie folgende Aufgabe: Verwenden Sie Ihr Beispiel, um die Struktur mit Dutzenden von Feldern nach jedem Feld zu sortieren

eine Struktur sein, die alle Eigenschaften der Order "vier" enthält (OrderStoploss(), OrderTakeProfit(), OrderOpenTime()....) - es gibt ein Dutzend von ihnen

Und können Sie die Sortierung eines Arrays solcher Strukturen nach jedem Feld mit Ihren Beispielen nachvollziehen? - Imho wird Ihr Code ziemlich viel wiegen, und ich habe oben geschrieben, dass es nicht möglich sein wird, diesen Code wiederzuverwenden

 
Igor Makanu:

Nein, so sollten Sie die Aufgabe nicht stellen.

Stellen Sie folgende Aufgabe: Sortieren Sie die Struktur, die Dutzende von Feldern hat, anhand Ihres Beispiels nach jedem Feld

eine Struktur sein, die alle Eigenschaften der Order "vier" enthält (OrderStoploss(), OrderTakeProfit(), OrderOpenTime()....) - es gibt ein Dutzend von ihnen

Und können Sie die Sortierung eines Arrays solcher Strukturen nach jedem Feld mit Ihren Beispielen nachvollziehen? - Ich habe oben geschrieben, dass es nicht möglich sein wird, diesen Code wiederholt zu verwenden.

Ein Problem aus dem Reich der Science-Fiction, das in der Praxis nie auftritt.

Sie können ein separates Feld für die Sortierung nach erstellen und vor der Sortierung eine Kopie des Feldes, nach dem Sie sortieren möchten, in dieses Feld einfügen.

 
Vladimir Pastushak:

In MT 5 funktioniert es ohne Probleme in MT 4 istArraySwap schuld, weil Mql 4 es nicht unterstützt...

#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:

Eine Herausforderung aus dem Reich der Fiktion.

Nein, es ist möglich, MQL zu verwenden, so wie Sie es mit SB vorgeschlagen haben.

Das Problem wird jedoch sein, dass dieser Code für eine bestimmte Aufgabe geschrieben werden wird

Wenn wir ein Beispiel geben - das Terminal-Panel mit Aufträgen wurde als Fenster in MQL reproduziert, die Sortierung wurde durchgeführt, alles dreht sich, alles funktioniert

Und wenn Sie einen Teil des Codes verwenden wollen, um das "Optimierungs"-Panel des Testers anzuzeigen, erhalten Sie eine Menge Änderungen. Es ist einfacher, den Code von Grund auf neu zu schreiben, einschließlich der Sortierungen, und Sie werden für Menschen lesbare Feldnamen haben wollen? - sonst muss man der Autor eines bekannten "Kerns" sein, um alle Namen von Identifikatoren in der Form von Abyrwalgh (A Dog's Heart) im Kopf zu behalten

)))

 
Igor Makanu:

Nein, es ist möglich, MQL zu verwenden, so wie Sie es mit SB vorgeschlagen haben.

aber das Problem wird sein, dass dieser Code für eine bestimmte Aufgabe geschrieben wird

Wenn wir ein Beispiel geben, wurde das Terminal-Panel mit Aufträgen als ein Fenster in MQL reproduziert, die Sortierung wurde durchgeführt, alles dreht sich, alles funktioniert

Und wenn Sie einen Teil des Codes verwenden wollen, um das "Optimierungs"-Panel des Testers anzuzeigen, erhalten Sie eine Menge Änderungen. Es ist einfacher, den Code von Grund auf neu zu schreiben, einschließlich der Sortierungen, und Sie werden für Menschen lesbare Feldnamen haben wollen? - sonst muss man der Autor eines bekannten "Kerns" sein, um alle Namen von Identifikatoren in der Form von Abyrwalgh (A Dog's Heart) im Kopf zu behalten

)))

Alles, was missverstanden werden kann, wird auch missverstanden werden. Ich meinte nicht die Möglichkeit/Unmöglichkeit, sondern die praktische Notwendigkeit, d. h. das Auftreten dieser Aufgabe.

Es ist nicht meine Idee, dass ich für jede Struktur mein eigenes Compare() schreiben muss.

 

Warum das Array/den Vektor der dicken Strukturen in verschiedene Felder sortieren?

lassen Sie es so liegen, wie es ist, es hat das Recht, sogar const zu sein :-) und für verschiedene Zwecke können Sie Indizes bauen

/// код не проверял - написал "с руки", демонстрировать идею
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:

Es ist nicht meine Idee, für jede Struktur ein anderes Compare() zu schreiben.

Genau so ist es, oder besser gesagt, ich kenne keinen anderen Weg, und diese Methode wird an eine bestimmte Aufgabe gebunden sein

und der Autor will eine Universallösung für 10 Pfund, na ja, warten wir mal ab, ob sich etwas klärt

 
Maxim Kuznetsov:

Warum das Array/den Vektor der dicken Strukturen in verschiedene Felder sortieren?

Lassen Sie es liegen, wie es ist, es hat das Recht, sogar const zu sein :-) und für verschiedene Zwecke können Sie Indizes bauen

Jemand wird jetzt schreiben ... dass es für mich so unbequem ist ... dass wir keine Hausfrauen sind, sondern Superentwickler, und dass wir alle Möglichkeiten der modernen Programmiertechnologien nutzen müssen, während ein zusätzliches Array so etwas wie Mittelalter ist ...

Obwohl mir persönlich diese Option besser gefällt.

#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:

Auf keinen Fall:
1) Es ist genug, ArrayCopy in die bedingte Kompilierung einzufügen, nicht ArraySwap.
2) ArrayCopy muss in einer benutzerdefinierten Version geschrieben werden, da die Standardversion keine NonPod Strukturen unterstützt.
3) Wir brauchen eine weitere bedingte Kompilierung für ArrayResize multi-domain array (Funktion gibt unterschiedliche Ergebnisse für verschiedene MT Versionen)

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:

Das wird es nicht:

Die Antwort war nicht für alle Fälle. Die meisten Menschen schließen.