我正在尝试使用 C 中的 qsort 根据特定列对二维数组进行排序。我附上了我正在使用的最小工作代码。本质上,我将指向数组行的指针传递给 qsort,并根据我要排序的列号,修改要在比较函数中进行比较的元素。现在,根据 C 约定,如果我有 2 列,我希望 colnum=0 和 colnum=1 对应于第 1 列和第 2 列。但是,在我的实现中,如果 colnum=1 表示第 1 列和 colnum,我会得到正确的结果=2 表示第 2 列。我很困惑为什么会这样?(我还包括了我使用的数组分配函数)。
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include "myfun.h"
static int colnum = 0;
int cmp(const void * a,const void * b);
int main(){
int i;
double **z1;
z1=matrix(5,2);
for (i=0; i<5; i++){
z1[i][1]=-i-1; z1[i][2]=16*i+10;
printf("before sort z1 %lf %lf \n",z1[i][1],z1[i][2]);
}
colnum=2;
qsort(z1,5,sizeof(double*),cmp);
for (i=0; i<5; i++){
printf("after sort z1 %lf %lf \n",z1[i][1],z1[i][2]);
}
getchar();
}
int cmp(const void * a,const void * b)
{
double** x = (double**) a;
double** y = (double**) b;
double xval, yval;
xval = *(*(x)+colnum);
yval = *(*(y)+colnum);
printf("%lf %lf \n",xval,yval);
if (xval < yval )
{
return 1;
}
else if (xval > yval)
{
return -1;
}
else
{
return 0;
}
}
double** matrix(int rows,int cols){
int k;
double **m;
m = (double **)malloc(rows * sizeof(double *));
for (k=0; k<rows; k++){
m[k] = (double *)malloc(cols * sizeof(double));
}
return m;
}