使用qsort对2D数组进行排序时发出警告

我正在尝试使用qsort在C中对2D数组进行排序。排序有效,但我收到警告:

warning: initialization discards 'const' qualifier from pointer target type [enabled by default]

如何修改比较函数以消除警告(假设qsort需要参数const void *pa, const void *pb

 int cmp (const void *pa, const void *pb ) { const int (*a)[2] = pa; // warning here const int (*b)[2] = pb; // warning here if ( (*a)[1]  (*b)[1] ) return -1; return 0; } 

我已经在Stack Overflow上阅读了这篇文章 ,但我仍然不确定如何改变比较函数。

我有一个看起来像这样的数组:

 int letterCount[26][2] = {{0, 0},{1, 0},{2, 0},{3, 0},{4, 0},{5, 0},{6, 0},{7, 0},{8, 0},{9, 0},{10, 0},{11, 0},{12, 0},{13, 0},{14, 0},{15, 0},{16, 0},{17, 0},{18, 0},{19, 0},{20, 0},{21, 0},{22, 0},{23, 0},{24, 0},{25, 0}}; 

除了在第二列中,不是零,而是用其他数字填充。 在填写0之后,我试图通过第二列对这个2d数组进行排序。

你可以用decls玩具,但最后我觉得这对你正在使用的比较器就足够了:

 int cmp (const void *pa, const void *pb ) { const int *a = pa; const int *b = pb; if (a[1] < b[1]) return -1; return (b[1] < a[1]); } 

您的数据“项目”只不过是2D数组中的int[]偏移量。 如果这是一个指针数组而不是一个真正的2D数组,这将是非常不同的。 Grijesh非常接近这一点,只是错过了[1]补偿(和简单的数学运算),如果他取消修改它的答案,我会放弃它。

这应该做什么(*a)[2] ? 看起来你在解释声明中取消引用了一个指向数组的指针。 这里缺乏更好的事情,我写了自己的版本,希望它能帮到你:

 #include  #include  void Qsort(int matrix[][2] , int lenght) { if(!lenght) return; int temp = 0 , pivot , b = 0 , e = lenght - 1 , test = 0; const int MIN =0 , MAX = e; srand(time(NULL)); test = (rand() % (MAX - MIN + 1)) + MIN; pivot = matrix[test][1]; while(b < e) { while(matrix[b][1] < pivot) b++; while(matrix[e][1] > pivot) e--; temp = matrix[b][1]; matrix[b][1] = matrix[e][1]; matrix[e][1] = temp; } Qsort(matrix , b); Qsort(&(matrix)[b + 1] , lenght - 1 - b); }