Função - Método para ordenar uma série de estruturas. Prêmio 10$ - página 2

 
Dmitry Fedoseev:

Alterar o tipo de variável em um lugar e o compilador mostrará erros nos outros três - alterar o nome do campo. Você pensaria que existem dezenas de estruturas que precisam ser classificadas. Sim, uma estrutura muito provavelmente requer uma classificação.

Não, não definir a tarefa desta maneira

estabeleça a seguinte tarefa: use seu exemplo para ordenar através da estrutura com dezenas de campos por cada campo

seja uma estrutura que contenha todas as propriedades da ordem "quatro" (OrderStoploss(), OrderTakeProfit(), OrderOpenTime()....) - há uma dúzia deles

E reproduzir a ordenação de uma série de tais estruturas por cada campo com seus exemplos? - imho, seu código pesará bastante, e escrevi acima que não será possível reutilizar este código

 
Igor Makanu:

Não, não é assim que você deve definir a tarefa.

estabeleça a seguinte tarefa: usando seu exemplo, classifique a estrutura que tem dezenas de campos por cada campo

seja uma estrutura contendo todas as propriedades da ordem "quatro" (OrderStoploss(), OrderTakeProfit(), OrderOpenTime()....) - há uma dúzia deles

E reproduzir a ordenação de uma série de tais estruturas por cada campo com seus exemplos? - imho, seu código pesará bastante. Eu escrevi acima que não será possível usar este código repetidamente.

Um problema do reino da ficção científica, nunca encontrado na prática.

Você pode fazer um campo separado para ordenar por e antes de ordenar, copiar para ele a partir do campo pelo qual você quer ordenar.

 
Vladimir Pastushak:

No MT 5 funciona sem problemas no MT 4 culpa oArraySwap porque o Mql 4 não o suporta...

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

Um desafio do reino da ficção.

Não, é possível usar MQL, da mesma forma que você sugeriu usar SB

Mas o problema será que este código será escrito para uma determinada tarefa

Se dermos um exemplo - o painel terminal com pedidos foi reproduzido como uma janela em MQL, a ordenação foi feita, tudo gira, tudo funciona

E se você quiser usar uma parte do código para exibir o painel de "otimização" do testador, você terá uma carga de mudanças. É mais fácil escrever o código do zero, incluindo os tipos, e você vai querer ter nomes de campos legíveis por humanos? - caso contrário você precisa ser o autor de um conhecido "kernel" para ter em mente todos os nomes de identificadores na forma de Abyrwalgh (A Dog's Heart)

)))

 
Igor Makanu:

Não, é possível usar MQL, da mesma forma que você sugeriu usar SB

mas o problema será que este código será escrito para uma tarefa específica

Se dermos um exemplo, o painel terminal com pedidos foi reproduzido como uma janela em MQL, a ordenação foi feita, tudo gira, tudo funciona

E se você quiser usar uma parte do código para exibir o painel de "otimização" do testador, você terá uma carga de mudanças. É mais fácil escrever o código do zero, incluindo os tipos, e você vai querer ter nomes de campos legíveis por humanos? - caso contrário você precisa ser o autor de um conhecido "kernel" para ter em mente todos os nomes de identificadores na forma de Abyrwalg (A Dog's Heart)

)))

Qualquer coisa que possa ser mal entendida será mal entendida. Não me referia à possibilidade/impossibilidade, mas à necessidade prática da mesma, ou seja, à ocorrência desta tarefa.

Não é minha idéia que para cada estrutura você deve escrever seu próprio Comparativo().

 

Por que classificar a matriz/vetor de estruturas grossas em diferentes campos?

deixe que ele se mantenha como está, ele tem o direito de ser constante :-) e para diferentes propósitos você pode 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:

Não é minha idéia escrever uma comparação() diferente para cada estrutura.

É exatamente assim, ou melhor, não sei de outra forma, e este método estará ligado a uma tarefa específica

e o autor quer uma solução universal por 10 libras, bem, vamos esperar e ver se algo se resolve

 
Maxim Kuznetsov:

por que classificar a matriz/vetor de estruturas grossas em diferentes campos?

Deixe estar como está, ele tem o direito de ser constante :-) e para diferentes propósitos você pode construir índices

Alguém vai escrever agora ... que é tão inconveniente para mim ... que não somos donas de casa, mas superdesenvolvedores, e devemos usar todas as possibilidades das modernas tecnologias de programação, enquanto uma gama adicional é algo como a Idade Média ...

Embora, pessoalmente, eu goste mais desta opção.

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

De jeito nenhum:
1) É suficiente inserir o ArrayCopy na compilação condicional, não o ArraySwap.
2) O ArrayCopy precisa ser escrito em um padrão personalizado, uma vez que o padrão não suporta estruturas NonPod.
3) Precisamos de mais uma compilação condicional para o ArrayResize array multi-domínio (a função dá resultados diferentes para diferentes versões 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:

Não vai:

A resposta não foi para todas as ocasiões. A maioria das pessoas fecha.