Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
qsort-C标准库如何发送带有非常量参数的比较函数?_C_Qsort - Fatal编程技术网

qsort-C标准库如何发送带有非常量参数的比较函数?

qsort-C标准库如何发送带有非常量参数的比较函数?,c,qsort,C,Qsort,我正在做一个家庭作业。 我需要根据员工创建的标题实现一个通用列表。 他们在标题中定义了如下比较函数: typedef int(*CompareListElements)(ListElement, ListElement); (ListElement=void*) 我试图使用标准库中的qsort,但我无法编译该程序,因为我试图传递给qsort的比较函数正在获取非常量参数。 有办法通过吗? 谢谢 我试图实现的功能: ListResult listSort(List list, CompareLis

我正在做一个家庭作业。 我需要根据员工创建的标题实现一个通用列表。 他们在标题中定义了如下比较函数:

typedef int(*CompareListElements)(ListElement, ListElement);
(ListElement=void*)

我试图使用标准库中的qsort,但我无法编译该程序,因为我试图传递给
qsort
的比较函数正在获取非常量参数。 有办法通过吗? 谢谢

我试图实现的功能:

ListResult listSort(List list, CompareListElements compareElement) {
    CHECK_RETURN(((list == NULL)||(compareElement == NULL)),LIST_NULL_ARGUMENT);
    int size=0;
    ListElement* elementArray=listToArray(list, &size);
    CHECK_RETURN((elementArray == NULL), LIST_OUT_OF_MEMORY);
    qsort(elementArray, size, sizeof(*elementArray), compareElement);
    returnArrayToList(list,elementArray);
    return LIST_SUCCESS;
}
错误:
从不兼容的指针类型传递“qsort”的参数4此示例演示如何使用为
qsort
提供的
compare()
中的参数。它将
const void*
指针强制转换为要比较的类型。请注意,我可以返回两个数字之间的简单差异,但在某些情况下,当差异“结束”时,可能会导致未定义的行为

你对你的链接列表说得很少,所以我坚持使用问题标题,关于
qsort()
。它使用
const
指针的原因是为了防止
compare()
函数直接更改数据:它返回一个基于读取数据值的值。显然,数据本身不能是
const
,否则
qsort()
将无法对其进行操作

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#define ARRSIZE  10

struct numarr {
    int numb;
    struct numarr *next;
    };

struct numarr array [ARRSIZE];

int compare( const void *arg1, const void *arg2 )
{
    if (((struct numarr*)arg1)->numb > ((struct numarr*)arg2)->numb)
        return 1;
    if (((struct numarr*)arg1)->numb < ((struct numarr*)arg2)->numb)
        return -1;
    return 0;
}    

int main() {
    int i;
    srand((unsigned)time(NULL));

    // set up a random array
    printf ("Unsorted: ");
    for(i=0; i<ARRSIZE; i++){
        array[i].numb = rand() % ARRSIZE;
        printf ("%d ", array[i].numb);
    }
    printf ("%\n");

    // sort and print the array
    qsort (array, ARRSIZE, sizeof(struct numarr), compare);
    printf ("Sorted:   ");
    for(i=0; i<ARRSIZE; i++){
        printf ("%d ", array[i].numb);
    }
    printf ("%\n");
    return 0;
}
我正在尝试使用标准库中的qsort比较函数

不好,尽量避免这种情况:

只需将compare函数包装到编译器接受的另一个函数中,并将其传递给
qsort()

在包装内,你可以用铸造锤来装东西…;-)


比较函数不应更改其参数,您可以修改代码吗?请显示代码,我们将一起尝试解决方案。通常,
compar
函数应该使用
const
指针,而不是元素。您好。。谢谢,但我想我没有解释清楚。。我现在添加了代码。。我希望你能理解。区别主要在于指向比较函数的指针的防御。不用担心,在阅读了@alkHi的答案后,我意识到。。谢谢,但我认为这对我没有帮助,因为包装比较函数是个问题,因为我必须向函数列表排序发送另一个参数。@NiranDokhanian:请查看我答案的更新。谢谢!这很有帮助!
Unsorted: 8 7 3 0 7 5 9 2 0 0
Sorted:   0 0 0 2 3 5 7 7 8 9
#include <stdlib.h>

typedef void* ListElement;
typedef int(*CompareListElements)(ListElement, ListElement);

CompareListElements c =  ... /* Initialise properly here. */

int cmp(const void * pv1, const void * pv2)
{
  return c((ListElement)pv1, (ListElement)pv2); /* Hammering here ... */
}


int main(void)  
{
  int a[4] = {3, 0, 2, 1};
  qsort(a, sizeof *a, 4, cmp);
}
int cmp_r(const void * pv1, const void * pv2, void * pv)
{
  CompareListElements c_r = pv;
  return c_r((ListElement)pv1, (ListElement)pv2); /* Still hammering here ... */
}

ListResult listSort(List list, CompareListElements compareElement) 
{
  ...

  qsort_r(elementArray, size, sizeof(*elementArray), cmp_r, compareElement);

  ...
}