Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/64.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
C qsort不会更改我的数组顺序_C_Function_Structure - Fatal编程技术网

C qsort不会更改我的数组顺序

C qsort不会更改我的数组顺序,c,function,structure,C,Function,Structure,我有一系列结构(员工): 我想按薪水重新排列我的阵列,我已经创建了一个竞争对手: int compareEmployeesBySalary(const void* a, const void* b){ employee_t* one = (employee_t*)a; employee_t* two = (employee_t*)b; if (one->salary == two->salary) return

我有一系列结构(员工):

我想按薪水重新排列我的阵列,我已经创建了一个竞争对手:

int compareEmployeesBySalary(const void* a, const void* b){
        employee_t* one = (employee_t*)a;
        employee_t* two = (employee_t*)b;

        if (one->salary == two->salary)
            return 0;
        else if (one->salary > two->salary)
            return 1;
        else
            return -1;
    }


void main()
{
    int i;

    employee_t** employeeArray = (employee_t**)malloc(sizeof(employee_t*)*5);

    for(i=0 ; i < 2 ; i++)
    {
        employeeArray[i] = (employee_t*)malloc(sizeof(employee_t));
        readEmployee( employeeArray[i] ); //input for 5 employee's
    }

    puts("");
    puts("beforesort\n");
    for(i=0; i <2 ; i++)
    {
        printEmployee(employeeArray[i]);
    }
    puts("--------------------------------------------------------");
    puts("after salary sort\n");

    qsort(&employeeArray, 2, sizeof(employee_t), compareEmployeesBySalary);
    for(i=0; i < 2 ; i++)
        printEmployee( employeeArray[i] );
}
int compareeemployeesbysalary(常量无效*a,常量无效*b){
雇员_t*one=(雇员_t*)a;
雇员二=(雇员二)b;
如果(一->工资==两->工资)
返回0;
否则如果(一->工资>二->工资)
返回1;
其他的
返回-1;
}
void main()
{
int i;
员工**员工数组=(员工**)malloc(sizeof(员工*)*5);
对于(i=0;i<2;i++)
{
employeeArray[i]=(employee_t*)malloc(sizeof(employee_t));
readEmployee(employeeArray[i]);//输入5名员工的
}
认沽权(“”);
放置(“排序前”\n);

对于(i=0;i您需要更改:

qsort(&employeeArray, 2, sizeof(employee_t), compareEmployeesBySalary);
致:

第一个参数必须是
employeeArray
,因为
qsort()
函数接收指向数组开头的指针,而不是指向数组开头的指针。另外,您有一个指针数组,而不是
employee\t
数组,所以第三个参数必须是
sizeof(employee\t*)

最后,将比较函数更改为:

int compareEmployeesBySalary(const void* a, const void* b){
        employee_t* one = *(employee_t **)a;
        employee_t* two = *(employee_t **)b;

        if (one->salary == two->salary)
            return 0;
        else if (one->salary > two->salary)
            return 1;
        else
            return -1;
}

因为同样,您拥有的是一个指针数组,所以
a
b
将是
employee\u t**

类型,您需要更改此类型:

qsort(&employeeArray, 2, sizeof(employee_t), compareEmployeesBySalary);
致:

第一个参数必须是
employeeArray
,因为
qsort()
函数接收指向数组开头的指针,而不是指向数组开头的指针。另外,您有一个指针数组,而不是
employee\t
数组,所以第三个参数必须是
sizeof(employee\t*)

最后,将比较函数更改为:

int compareEmployeesBySalary(const void* a, const void* b){
        employee_t* one = *(employee_t **)a;
        employee_t* two = *(employee_t **)b;

        if (one->salary == two->salary)
            return 0;
        else if (one->salary > two->salary)
            return 1;
        else
            return -1;
}

因为同样,你拥有的是一个指针数组,所以
a
b
将是
employee\t**

我看到的一件事是你通过了
sizeof(employee\t)
插入qsort的size参数,而数组只存储指向
employee\t
的指针。我建议您尝试将
qsort中的
sizeof(employee\t)
替换为
sizeof(employee\t*)

我看到的一件事是您通过了
sizeof(employee\t)
插入qsort的size参数,而数组只存储指向
employee\u t
的指针。我建议您尝试将
qsort中的
sizeof(employee\u t)
替换为
sizeof(employee\u t*)

您可能正在运行过时的发行版二进制文件,而调试版本每次都会重新生成。
qsort(&employeeArray…
看起来不正确。这不应该是
qsort吗(employeeArray…
?@Eugene Sh我能解决这个问题吗?但当我调试时,它会通过我的比较函数打印出来——你是什么意思?如果你设置断点,代码会正常工作吗?重新生成发布版本?你可能已经运行了过时的发布版本二进制文件,而每次都会重新生成调试版本。
qsort(&employeeArray…
看起来不太对头。这不应该是
qsort吗(employeeArray…
?@Eugene Sh我能解决这个问题吗?但当我调试它时,它会通过我的比较函数打印出来——你是什么意思?如果你设置断点,代码会工作吗?还要重建发布版本?@EugeneSh。这很奇怪。代码按原样调用UB,所以我会责怪它——尽管我觉得很难相信它在调试中能工作呃,但他可能很幸运。奥托,当我测试我的改装时,它就像一个符咒。是的,听起来不错unlikely@EugeneSh.这很奇怪。代码按原样调用UB,所以我会责怪它——虽然我觉得很难相信它在调试器中工作,但他可能只是幸运而已。OTOH,当我测试我的修改时,它像一个魅力。是的,听起来不太可能