2010-06-11 3 views
2

Я использую QSort от C libary и у меня есть тип данныхбыстрой сортировки проблема

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

пример, и я называю quicksor функцию с

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

и функции обратного вызова

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); 
} 

но я всегда возникает ошибка сегментации. Зачем?

+0

«qsort' не обязательно будет быстро сортировать. – paxdiablo

+0

Вы сортируете массив Element_type * или массив Element_type? Как вы выделили этот массив? – nos

ответ

3

Ваша функция сравнения должна возвращать, считается ли элемент elem1 меньше, равным или большим, чем elem2, возвращая соответственно отрицательное значение, ноль или положительное значение.

Также, если вы хотите отсортировать, например, массив из Element_Type, тогда вы должны набрать void*, чтобы ввести Element_Type*. Если ваши элементы, которые вы пытаетесь отсортировать, это Element_Type*, тогда вы должны отбросить пустоту * до Element_Type**.

Если элементы, которые вы пытаетесь отсортировать, имеют тип Element_Type*, убедитесь, что вы выделяете память для каждого из этих элементов и затем инициализированы для каждого элемента перед вызовом qsort.

+0

думаю, что я знаю это, но synthax почему segmentation fault мой указатель: pElement = (Element_type **) malloc (sizeof (Element_type *) * iNewSize); – farka

+0

@farka: Вы говорите, что знаете о возвращаемом значении, но вы этого не делаете. –

+0

Я использовал pElement = (Element_type **) malloc (sizeof (Element_type *) * iiNewSize); dann: pElement [iCountElement] = (Element_type *) (DMALLOC (sizeof (Element_type))); memset (pElement [iCountElement], "data", sizeof (Element_type)); после этого я звоню qsort, но всегда проблема !! 11 – farka

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

Вы должны позвонить QSort (pElement, ...), не QSort (* pElement, ...). Объявление pElement в верхней части сообщения не может быть точным.

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 
} 

Вызов QSort так:

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

СПУСТЯ EDIT: дать нам кусок кода, так что мы можем видеть больше проблем, если это так

0

Это самый простой способ исправьте свою функцию сравнения:

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); 
} 

Я не могу прочитайте первый сегмент кода, поэтому я не буду делать предложения по вашему segfault.