Función - Método para ordenar una matriz de estructuras. Premio 10$ - página 2

 
Dmitry Fedoseev:

Cambia el tipo de variable en un lugar y el compilador mostrará errores en los otros tres: cambia el nombre del campo. Se podría pensar que hay docenas de estructuras que necesitan ser ordenadas. Sí, lo más probable es que una estructura requiera una clasificación.

No, no se debe establecer la tarea de esta manera

establezca la siguiente tarea: utilice su ejemplo para ordenar la estructura con docenas de campos por cada campo

que sea una estructura que contenga todas las propiedades de la orden "cuatro" (OrderStoploss(), OrderTakeProfit(), OrderOpenTime()....) - hay una docena de ellos

¿Y reproducir la ordenación de un array de dichas estructuras por cada campo con tus ejemplos? - imho, su código pesará bastante, y escribí arriba que no será posible reutilizar este código

 
Igor Makanu:

No, no es así como debes establecer la tarea.

establezca la siguiente tarea: utilizando su ejemplo, ordene la estructura que tiene docenas de campos por cada campo

que sea una estructura que contenga todas las propiedades de la orden "cuatro" (OrderStoploss(), OrderTakeProfit(), OrderOpenTime()....) - hay una docena de ellos

¿Y reproducir la ordenación de un array de dichas estructuras por cada campo con tus ejemplos? - En mi opinión, tu código pesará bastante. He escrito más arriba que no será posible utilizar este código repetidamente.

Un problema del reino de la ciencia ficción, nunca encontrado en la práctica.

Puede hacer un campo separado para ordenar por y antes de ordenar, copiar en él desde el campo por el que quiere ordenar.

 
Vladimir Pastushak:

En MT 5 funciona sin problemas en MT 4 culpa aArraySwap porque Mql 4 no lo soporta...

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

Un reto desde el ámbito de la ficción.

No, es posible utilizar MQL, tal y como sugeriste utilizando SB

Pero el problema será que este código se escribirá para una determinada tarea

Si ponemos un ejemplo - el panel de la terminal con las órdenes se ha reproducido como una ventana en MQL, la clasificación se ha hecho, todo gira, todo funciona

Es más fácil escribir el código desde cero, incluyendo las clasificaciones, y querrás tener nombres de campos legibles para los humanos... - de otro modo, hay que ser el autor de un conocido "núcleo" para tener en cuenta todos los nombres de identificadores en forma de Abyrwalg (Corazón de perro)

)))

 
Igor Makanu:

No, es posible utilizar MQL, tal y como sugeriste utilizando SB

pero el problema será que este código será escrito para una tarea específica

Si ponemos un ejemplo, el panel de la terminal con las órdenes se ha reproducido como una ventana en MQL, se ha hecho la ordenación, todo gira, todo funciona

Es más fácil escribir el código desde cero, incluyendo las clasificaciones, y querrás tener nombres de campos legibles para los humanos... - de otro modo, hay que ser el autor de un conocido "núcleo" para tener en cuenta todos los nombres de identificadores en forma de Abyrwalg (Corazón de perro)

)))

Todo lo que puede ser malinterpretado será malinterpretado. No me refería a la posibilidad/imposibilidad, sino a la necesidad práctica de hacerlo, es decir, a la ocurrencia de esta tarea.

No es mi idea que para cada estructura tenga que escribir mi propio Compare().

 

¿por qué ordenar el array/vector de estructuras gruesas en diferentes campos?

déjalo como está, tiene derecho a ser incluso const :-) y para diferentes propósitos puedes construir índices

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

No es mi idea escribir un Compare() diferente para cada estructura.

Así es exactamente, o más bien no conozco otra forma, y este método estará ligado a una tarea específica

y el autor quiere una solución universal por 10 libras, bueno, esperemos a ver si se aclara algo

 
Maxim Kuznetsov:

¿Por qué ordenar el array/vector de estructuras gruesas en diferentes campos?

Déjalo como está, tiene derecho a ser incluso const :-) y para diferentes propósitos puedes construir índices

Alguien escribirá ahora ... que es tan inconveniente para mí ... que no somos amas de casa, pero superdevelopers, y debemos utilizar todas las posibilidades de las tecnologías de programación moderna, mientras que una matriz adicional es algo como la Edad Media ...

Aunque, personalmente, me gusta más esta opción.

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

No hay manera:
1) Basta con introducir ArrayCopy en la compilación condicional, no ArraySwap.
2) ArrayCopy necesita ser escrito en uno personalizado, ya que el estándar no soporta estructuras NonPod.
3) Necesitamos una compilación condicional más para ArrayResize array multidominio (la función da diferentes resultados para diferentes versiones de MT)

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:

No lo hará:

La respuesta no era para todas las ocasiones. La mayoría de la gente cierra.