La funzione di compare tra stringhe l'ho realizzata così:
codice:
int comparatore_stringhe(const void *p1, const void *p2){
/*
I due parametri sono dei puntatori ai valori dell'array,
ovvero 2 puntatori a stringhe: char **. Prima li
"interpretiamo" con un cast a puntatori a stringhe,
poi li dereferenziamo per ottenere l'effettiva stringa.
*/
char *stringa1 = *(char **)p1;
char *stringa2 = *(char **)p2;
int i;
/*
Confronto alfabetico tra due stringhe.
Se una stringa e' prefisso dell'altra, essa e' minore.
Supponendo non siano ne' identiche ne' prefisso,
allora il primo carattere discordante determina l'ordinamento.
La procedura sotto è equivalente ad una chiamata alla funzione
strcmp(stringa1, stringa2); definita in string.h
*/
for (i=0; stringa1[i] == stringa2[i] && stringa1[i] != '\0'; i++);
if ( stringa1[i] < stringa2[i] )
return -1;
else if ( stringa1[i] == stringa2[i] /* == '\0' */)
return 0;
else return 1;
}
Quella per il confronto tra interi invece è:
codice:
int compara_int(const void *a, const void *b)
{
primo=*(int *)a;
secondo= *(int *)b;
if (primo<secondo) return -1;
if(primo>secondo) return 1;
return 0;
}
Ora queste due funzioni le devo passare alla qsort in base al campo che mi viene richiesto: se è un campo di tipo stringa, passo la prima, se è un campo di tipo intero passo la seconda. E' qui che sorge il mio problema..come posso sapere quale delle due "versioni" mi serve, non conoscendo a priori il campo?