Предупреждение при сортиране на 2D масив с 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;
}

Прочетох тази публикация в 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}};

Освен във втората колона, вместо нули, те се попълват с други числа. Опитвам се да сортирам този 2d масив по втората колона, след като нулите са попълнени.


person Austin    schedule 22.09.2013    source източник


Отговори (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[] отмествания в 2D масив. Ако това беше масив от указатели, а не истински 2D масив, това би било значително различно. Grijesh беше много близо до това, липсваха му само отместванията [1] (и простата математика) и ако той възстанови отговорите си, за да го поправи, просто ще изпусна това.

person WhozCraig    schedule 22.09.2013
comment
Имайте предвид, че използването на подобно изваждане крие риск от препълване и последващо недефинирано поведение, ако стойностите в масивите са много големи и с противоположни знаци. На практика това обикновено не е проблем, но бъдете внимателни. Има трик за връщане на -1, 0 или +1 с помощта на return (a[1] > b[1]) - (b[1] > a[1]); или нещо подобно. Или можете да го направите по еквивалентния, но по-ясен начин: if (a[1] > b[1]) return +1; else if (a[1] < b[1]) return -1; else return 0; (което дори може да е по-ефективно, тъй като само условно изчислява второто сравнение). - person Jonathan Leffler; 23.09.2013
comment
Защо задачата const int (*a)[2] = pa; дава предупреждение? - person haccks; 24.06.2014

какво трябва да прави това (*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);

    }
person Farouq Jouti    schedule 22.09.2013
comment
Целта е да сортирате 2D масив по втората колона - person Austin; 22.09.2013
comment
какво се опитваш да направиш в тези редове - person Farouq Jouti; 22.09.2013
comment
създаване на масив с размер две (защото сортирам 2D масив), след което сравнявам втория елемент на всеки - person Austin; 22.09.2013