2010-10-31 23 views
1

J'utilise le qsort intégré pour trier un tableau de structures. Mais après l'appel à qsort le dernier élément du tableau semble avoir eu sa valeur que je suis en train de trier par set à vide.c qsort semble supprimer la dernière valeur dans le tableau

Voici mon code ...

int numEntries = 5; 
TvEntry* entries[numEntries]; //create array 

//Entries get added to the array here... 

qsort(*entries, numEntries, sizeof(TvEntry*), &compareByName); //sort 

displayAll(entries, numEntries); //display 

//here is my sort method 
int compareByName(const void* val1, const void* val2) 
{ 
    const TvEntry* entry1 = (TvEntry*)val1; 
    const TvEntry* entry2 = (TvEntry*)val2; 
    return strcasecmp(entry1->title, entry2->title); 
} 

//here is my display method 
void displayAll(TvEntry* entries[], int length) 
{ 
    if(entries == NULL) 
    { 
     printf("List is empty\n"); 
    } 
    else 
    { 
     int i = 0; 
     for(i = 0; i < length; i++) 
     { 
      printf("ENTRY: %s\n", entries[i]->title); 
     } 
    } 
} 

Je dois dire que si je commente la ligne qui appelle qsort toutes les entrées sont correctement affichées mais quand qsort est appelé alors les entrées sont tous affichés (Non Trié) et l'impression d'une valeur vide pour le titre de la dernière entrée.

Répondre

10
qsort(*entries, numEntries, sizeof(TvEntry*), &compareByName); 

est incorrect, vous ne voulez pas déréférencer le premier élément de votre tableau. Faites-

qsort(entries, numEntries, sizeof(TvEntry*), &compareByName); 

En outre, votre comparaison funciton recevra des pointeurs sur les éléments et les éléments sont des pointeurs, il devrait donc être, par exemple

int compareByName(const void* val1, const void* val2) 
{ 
    const TvEntry** entry1 = (TvEntry**)val1; 
    const TvEntry** entry2 = (TvEntry**)val2; 
    return strcasecmp((*entry1)->title, (*entry2)->title); 
} 
+0

qsort doit appeler avec "compareByName" (sans "&"!). strcasecmp n'est pas ANSI C – user411313

+0

avec ou sans & n'a pas d'importance, mais le & est juste redondant. – nos

+0

Merci pour l'aide a fonctionné parfaitement. – Ben