roby89
ti sei dilungato ma a mio avviso , hai confuso sole le idee
puntatore a funzione come ti ho detto .

bisogna creare una semplicissima funzione scabia
due funzioni compare dai nomi dati nei prototipi
una che restituisce -1 se a < b
l'altra che restituisce -1 se a>b
e passarli alla funzione in seguito o di ordinamento crescente o di ordinamento decrescente

io sono un principiante autodidatta
l'unica cosa che mi è servita di quello che ha detto roby
è

if(compare(v[i],v[i-1])<0)
swap(&v[i],&v[i-1]);


posto come lo ho risolto io , ma solo per dimostrare che ha una risoluzione più
semplice della descrizione


codice:
#include <stdio.h>
#include <stdlib.h>
void bubble( int work[], const int size, int (*compare)( int a, int b ) );
int ascending( int a, int b );
int descending( int a, int b );
 void swap( int *a, int *b );

int main(int argc, char *argv[])
{
  int *array;
  int i,j;
  printf("Quanti elementi vuoi inserire nell'array ?  \n");
  scanf("%d",&i);
  array=(int*)malloc(sizeof(int)*i);
  for(j=0;j<i;j++)
  {
      printf("inserisci l'elemento %d  -->",j+1);
      scanf("%d",&array[j]);
      
      
      }
      
  printf("Come vuoi ordinare l'array ? \n1 ordine decrescente  \n2 ordine crescente\n");
  scanf("%d",&j);
  if(j==1)
   bubble( array , i, descending );
  else if(j==2)  
  bubble( array , i, ascending ); 
  //stampa vettore
  for(j=0;j<i;j++)
      printf("%d\n",array[j]);
  
  
  system("PAUSE");	
  return 0;
}


int descending(int a, int b)
{
      if(a>b)
           return -1;
     else 
      return 1 ;

}

int ascending(int a ,int b)
{

   if(a<b)
           return -1; 
     else 
          return 1 ;
 
  
    
}


void swap( int *a, int *b )
{
    int temp;
    temp=*a;
    *a=*b;
    *b=temp;
    
    
    
    }
void bubble( int v[], const int size, int (*compare)( int a, int b ) )
{
    int i;
    for(i=1;i< size;i++)
    {
    if((*compare)(v[i],v[i-1])<0)
    swap(&v[i],&v[i-1]);
    
   }    
    
    
    }