2010-06-11 20 views
2

-je utiliser qsort de C libary et je datatypeproblème tri rapide

Element_type **pElement and Element_type is struct typedef element_type {int ,char ....} 

exemple, et j'appeler quicksor fonction avec

qsort(*pElement,iCountElement,(size_t)sizeof(Element_type),compare); 

et la fonction de rappel

static int compare(const void *p1, const void *p2) { 
    Element_type *a1 = (Element_type *)p1; 
    Element_type *a2 = (Element_type *)p2; 
    return ((a2)->iServiceId < (a1)->iServiceId); 
} 

mais je toujours obtenir une erreur de segmentation. Pourquoi?

+0

'qsort' n'est pas requis pour être un tri rapide en passant. – paxdiablo

+0

Triez-vous un tableau de Element_type * ou un tableau de Element_type? Comment avez-vous alloué ce tableau? – nos

Répondre

3

Votre fonction de comparaison doit retourner si elem1 est considéré comme inférieur, égal ou supérieur à elem2 en renvoyant, respectivement, une valeur négative, zéro ou une valeur positive.

De même, si vous souhaitez trier par exemple un tableau de Element_Type, vous devez alors convertir le void* en type Element_Type*. Si vos éléments que vous essayez de trier sont Element_Type*, vous devez convertir le vide * en Element_Type**.

Si les éléments que vous essayez de trier sont de type Element_Type*, assurez-vous d'allouer de la mémoire pour chacun de ces éléments, puis initialisez chaque élément avant d'appeler qsort.

+0

pense que je sais que, mais synthax pourquoi la segmentation faute mon pointeur est: pElement = (Element_type **) malloc (sizeof (Element_type *) * iNewSize); – farka

+0

@farka: Vous dites que vous connaissez la valeur de retour, mais vous ne le faites pas. –

+0

J'ai utilisé pElement = (Element_type **) malloc (sizeof (Element_type *) * iiNewSize); dann: pElement [iCountElement] = (type_élément *) (DMALLOC (sizeof (type_élément))); Memset (pElement [iCountElement], "data", sizeof (type_élément)); après que j'appelle qsort, mais toujours le problème !! 11 – farka

1
pElement = (Element_type *)malloc(sizeof(Element_type)* iiNewSize); 

Vous devez appeler qsort (pElement, ...), pas qSort (* pElement, ...). La déclaration pElement en haut de votre message ne peut pas être exacte.

0
static int compare(const void *p1, const void *p2) { 
    Element_type *a1 = *(Element_type *)p1; 
    Element_type *a2 = *(Element_type *)p2; 

    if((a1)->iServiceId < (a2)->iServiceId) 
    { 
     return -1; // this means that a1 < a2 in your criteria 
    } 

    if((a1)->iServiceId == (a2)->iServiceId) 
    { 
     return 0; // this means that a1 == a2 in your criteria 
    } 

    return 1; // this means that a1 > a2 in your criteria 
} 

Appel qsort comme ceci:

qsort(pElement,iCountElement,(size_t)sizeof(Element_type),compare); 

PLUS TARD EDIT: nous donner un morceau de code afin que nous puissions voir plus de problèmes si c'est le cas

0

Ceci est la meilleure façon de corrigez votre fonction de comparaison:

static int compare(const void *p1, const void *p2) { 
    Element_type *a1 = (Element_type *)p1; 
    Element_type *a2 = (Element_type *)p2; 
- return ((a2)->iServiceId < (a1)->iServiceId); 
+ return (a1->iServiceId) - (a2->iServiceId); 
} 

Je ne peux pas lire les sapins t segment de code, donc je ne ferai pas de suggestions sur votre segfault.