Newsgroup: it.comp.lang.c++
Titolo: bool (*compare) (int,int) un mistrero

Ciao a tutti,
scusate per la stupidità della domanda ma sono proprio agli inizi.
Ho un problema nel capire alcuni passaggi all'interno di questo 
esercizio, eccovi il testo:
# include <iostream>
# include <iomanip>
using namespace std;
void selectionSort(int [], const int, bool (*) (int, int));
void swap(int * const, int * const);
bool ascending(int, int);
bool descending(int, int);
int main(){
   const int arraySize = 10;
   int order;
   int counter;
   int array[arraySize] = {2,6,4,8,10,12,89,68,45,37};
   //int array[arraySize] = {2,6,4,};
   cout << "Scrivi 1 per un ordine ascedente,\n";
   cout << "Scrivi 2 per un ordine discendente\n";
//   cin >> order;
   order = 1;
   for (counter = 0;counter < arraySize; counter++)
     cout << setw(4) << array[counter];
   cout << endl;
   if (order == 1){
     selectionSort(array,arraySize,ascending);
     cout << "Ordine ascedente" << endl;
   }
   else{
     selectionSort(array,arraySize,descending);
     cout << "Ordine discendente" << endl;
   }
   for (counter = 0;counter < arraySize; counter++)
     cout << setw(4) << array[counter];
   cout << endl;
}
   void selectionSort(int work[], const int size, bool (*compare) 
(int,int) ){
     int smallestOrLargeset;
     //for (int i=0;i < size - 1;i++){
     for (int i=0;i < size;i++){
       smallestOrLargeset = i;
       //for (int index = i + 1;index < size;index++)
       for (int index = i ;index < size;index++)
         if (!(*compare)(work[smallestOrLargeset],work[index]))
           smallestOrLargeset= index;
       swap(&work[smallestOrLargeset],&work[i]);
     }
   }
   void swap(int * const element1Ptr,int * const element2Ptr){
     int hold = *element1Ptr;
     *element1Ptr = *element2Ptr;
     *element2Ptr = hold;
   }
   bool ascending(int a,int b){
     return a < b;
   }
   bool descending(int a,int b){
     return a > b;
   }
Qui ho estrapolato le parti in questione:
......
  if (order == 1){
     In questo punto facciamo una chiamata una funzione e gli passiamo 3 
valori, array, la sua dimensione (arraySize) ma non ho capito il valore 
di "ascending"
     selectionSort(array,arraySize,ascending);
     cout << "Ordine ascedente" << endl;
   }
..........
   Come sopra i primi due valori sono ok, ma cosa significa
   bool (*compare) (int,int)? Ho capito che chiama una funzione tramite
   un puntatore e passa un valore booleano.
   Qui per me c'è il mistero (int,int) da dove li prende quei valori?
   void selectionSort(int work[], const int size, bool (*compare) 
(int,int) ){
     int smallestOrLargeset;
     //for (int i=0;i < size - 1;i++){
     for (int i=0;i < size;i++){
       smallestOrLargeset = i;
       //for (int index = i + 1;index < size;index++)
       for (int index = i ;index < size;index++)
         Il ! a cosa serve? Dove "vede" la differenza tra questo e
         quello?
         if (!(*compare)(work[smallestOrLargeset],work[index]))
           smallestOrLargeset= index;
       swap(&work[smallestOrLargeset],&work[i]);
     }
   }
........
   Anche qui, da dove vengono passati i valori ma SOPRATUTTO a chi li 
restituisce?
   bool ascending(int a,int b){
     return a < b;
   }
Ciao e grazie.

   }
La funzione ascending (tramite il suo puntatore) viene passata alla 
funzione selectionSort nel parametro "compare". La funzione 
selectionSort utilizza compare nella riga che hai esaminato prima...
PS. A mio parere il codice che hai presentato è scritto piuttosto male. 
Soprattutto i nomi dati alle variabili non sono molto appropriati. 
Inoltre il codice è sostanzialmente C, in C++ si potrebbe fare la cosa 
in modo molto più elegante.
E.

 Il ! è la negazione logica.
La negazione logica può essere scritta anche in questo modo
    if ((*compare) != (work[smallestOrLargeset],work[index]))
       swap(&work[smallestOrLargeset],&work[i]);
Ciao e grazie per l'interesse.
Lele

    if ((*compare) != (work[smallestOrLargeset],work[index]))
No, non si scrive così. E' in questo punto che viene finalmente chiamata 
la funzione ascending (tramite il puntatore compare. La funzione ritorna 
un bool che viene negato con !.
E.

Ciao ?manu*,
grazie per l'interesse, adesso continuerò con i miei studi.
Ciao
Lele