快速排序问题

发布于 2024-09-05 05:53:46 字数 537 浏览 3 评论 0原文

我使用 C 库中的 qsort,并且有数据类型

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

示例,并且我使用回调函数调用快速

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

,但我总是遇到分段错误。为什么?

I use qsort from C libary and I have datatype

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

example, and i call quicksor function with

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

and callback function

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

but I always get segmentation fault. Why?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

埋葬我深情 2024-09-12 05:53:46

您的比较函数应通过分别返回负值、零或正值来返回 elem1 是否小于、等于或大于 elem2。

此外,如果您想要对 Element_Type 数组进行排序,那么您可以将 void* 转换为 Element_Type* 类型。如果您尝试排序的元素是 Element_Type*,那么您可以将 void* 转换为 Element_Type**

如果您尝试排序的项目属于 Element_Type* 类型,请确保为每个项目分配内存,然后在调用 qsort 之前为每个项目进行初始化。

Your compare function should return whether elem1 is considered less than, equal to, or greater than elem2 by returning, respectively, a negative value, zero or a positive value.

Also if you want to sort for example an array of Element_Type then you would cast the void* to type Element_Type*. If your elements that you are trying to sort are Element_Type* then you would cast the void* to Element_Type**.

If the items you are trying to sort are of type Element_Type* the make sure you are allocating memory for each of those items and then initialized for each item before calling qsort.

债姬 2024-09-12 05:53:46
   pElement = (Element_type *)malloc(sizeof(Element_type )* iiNewSize);

您应该调用 qsort(pElement, ...),而不是 qsort(*pElement, ...)。您帖子顶部的 pElement 声明可能不准确。

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

You should call qsort(pElement, ...), not qsort(*pElement, ...). The pElement declaration at the top of your post cannot be accurate.

自演自醉 2024-09-12 05:53:46
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);

稍后编辑: 给我们一段代码,以便我们可以看到更多问题(如果是这种情况)

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
}

Call qsort like this:

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

LATER EDIT: give us a piece of code so we can see more problems if that's the case

南…巷孤猫 2024-09-12 05:53:46

这是纠正比较函数的最简单方法:

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

我无法读取第一个代码段,因此我不会对您的段错误提出建议。

This is the easiest way to correct your compare function:

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

I can't read the first code segment, so I won't make suggestions on your segfault.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文