Non è così che funziona la qsort.Se tu hai un array di schede, la qsort internamente farà una cosa del genere:
codice:
// in mezzo al codice
scheda s1,s2;
if(compare(s1,s2)>0)
swap(&s1,&s2);
Per cui le funzioni che hai fatto sono sbagliate, semmai:
codice:
int compara_nomi (const void *p1, const void *p2)
{
scheda s1 = * ((scheda*)p1);
scheda s2= * ((scheda*)p2);
return strcmp(s1.nome,s2.nome);
}
E questa è la funzione che passerai come argomento alla qsort, usando un array di schede e non un array di puntatori a schede (non sarebbe necessario).
Il cast non è "magico", se quel const void* p1 è un puntatore a un' area di memoria che contiene un dato di tipo scheda, convertendolo in char** non ottieni il puntatore al campo che contiene il nome.
Quindi mi suggerisci di invocare la qsort corretta con uno switch?
Questa è una possibile soluzione.
A seconda della scelta (suppongo ci sia un menù) dell' utente, all' interno dello switch cambi il valore del puntatore a funzione che passerai alla qsort.