Предупреждение при сортировке двумерного массива с помощью qsort
Я пытаюсь использовать qsort
сортировать 2D-массив в C. Сортировка работает, но я получаю предупреждение:
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;
if ( (*a)[1] > (*b)[1] ) return -1;
return 0;
}
Я прочитал этот пост о переполнении стека, но я все еще не уверен, как мне следует изменить функцию сравнения.
У меня есть массив, который выглядит так:
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}};
За исключением второго столбца, вместо нулей они заполнены другими числами. Я пытаюсь отсортировать этот 2d массив по второму столбцу, после того как 0 заполнены.
2 ответа
Вы можете поиграть с 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]);
}
Ваши данные "элементы" не более чем int[]
смещения в двумерном массиве. Если бы это был массив указателей, а не подлинный двумерный массив, это было бы значительно иначе. Грижеш был очень близок к этому, только пропустив [1]
смещения (и простая математика), и если он восстановит свои ответы, чтобы исправить это, я просто отброшу это.
Что это должно делать (*a)[2]
? похоже, что вы разыменовываете указатель на массив в объявлении. здесь из-за отсутствия лучших вещей я написал свою собственную версию, я надеюсь, что она поможет вам:
#include <time.h>
#include <stdio.h>
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);
}