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,当我测试我的修改时,它像一个魅力。是的,听起来不太可能