Ordinare un array di puntatori

Sezione dedicata a metatrader (ed altre piattaforme) ed al suo linguaggio di programmazione per il trading automatico
Rispondi
MarcoNeri
Messaggi: 3
Iscritto il: 03/10/2014, 10:47

Ordinare un array di puntatori

Messaggio da MarcoNeri »

Ciao a tutti,
ho iniziato da un po' a scrivere in mql(4) e mi sono imbattuto nel seguente problema.
Ho un array di puntatori del tipo

Codice: Seleziona tutto

Order* m_orders[];
Order è una classe che contiene tutte le informazioni relative ad un ordine piazzato (ticket, price, data dell'ordine, sl, tp ecc ecc).
Ebbene, ho bisogno di ordinare questo array per data dell'ordine ma la piattaforma mi consente di passare ad una funzione solo array per referenza e quindi non riesco a passare ad una funzione che mi faccia l'ordinamento il tipo di array sopra descritto.
In C sarebbe piuttosto semplice con una funzione di questo tipo:

Codice: Seleziona tutto

void Sort(Order *pointer, int size)
{
    Order *i, *j, temp;
    for(i = pointer; i < pointer + size; i++)
	{
        for(j = i + 1; j < pointer + size; j++)
		{
            if((*j).OrderDate < (*i).OrderDate)
			{
                temp = *j;
                *j = *i;
                *i = temp;
            }
        }
    }
}
ma qui non è possibile.
Suggerimenti ?
MarcoNeri
Messaggi: 3
Iscritto il: 03/10/2014, 10:47

Re: Ordinare un array di puntatori

Messaggio da MarcoNeri »

Avendo trovato la soluzione mi rispondo da solo :-D

Codice: Seleziona tutto

void QuickSort(Order* &arr[], uint left, uint right)
 {
  uint i = left, j = right;
  Order* tmp;
  Order* pivot = arr[MathAbs((left + right) / 2)];

  /* partition */
  while (i <= j) {
        while (arr[i].GetOrderOpenTime() < pivot.GetOrderOpenTime())
              i++;
        while (arr[j].GetOrderOpenTime() > pivot.GetOrderOpenTime())
              j--;
        if (i <= j) {
              tmp = arr[i];
              arr[i] = arr[j];
              arr[j] = tmp;
              i++;
              j--;
    }
   }

   /* recursion */
   if (left < j)
       QuickSort(arr, left, j);
   
   if (i< right)
           QuickSort(arr, i, right);
}
Ed ecco bello e ordinato l'array di puntatori.

Ciao
MarcoNeri
Messaggi: 3
Iscritto il: 03/10/2014, 10:47

Re: Ordinare un array di puntatori

Messaggio da MarcoNeri »

Modo ancora più elegante:

Codice: Seleziona tutto

template <typename C, typename BinaryPredicate>
void Sort(C* &Array[], int size, BinaryPredicate& comp)
{
   int j;
   for(int i=1; i < size; ++i)
   {
      C* temp = Array[i];
      j = i-1;
      
      while(j>=0 && comp.Compare(temp, Array[i-1]) ) 
      {
         Array[j+1] = Array[j];
         --j;
      }
      Array[j+1] = temp;
   }
};
e come predicato si puo utilizzare un classe del tipo:

Codice: Seleziona tutto

class OrderByDateDescending
{
 public:
   bool Compare( Order& LHS,  Order& RHS)
   {
      return LHS.GetOrderOpenTime() > RHS.GetOrderOpenTime();
   }
};
L'utilizzo è questo:

Codice: Seleziona tutto

int arraySize = ArraySize(m_orders);
OrderByDateAscending *helper = new OrderByDateAscending();
 
   Sort(m_orders, arraySize, helper);
   
   delete helper;
Avatar utente
carlo10
Messaggi: 4261
Iscritto il: 08/05/2014, 21:17

Re: Ordinare un array di puntatori

Messaggio da carlo10 »

Sono contento tu abbia già risolto, colgo l'occasione per darti il benvenuto fa sempre piacere un nuovo programmatore qui sul forum!
Rispondi

Chi c’è in linea

Visitano il forum: Nessuno e 0 ospiti