функция сравнения, дающая ошибку сегментации в qsort - PullRequest
0 голосов
/ 22 апреля 2019

Я сделал функцию сравнения для qsort, и она вызывает ошибку сегментации. почему это происходит и как это исправить?

example my two arrays are:
G->grades = [2,3,3,2,2,2] 
G->order =  [0,2,3,4,5,6]

Я хочу отсортировать G-> order, используя значения G-> grades. Таким образом, вывод должен быть:
G->order = [2,3,0,4,5,6]

u32* vert_grades;

char OrdenWelshPowell(Grafostv* G)
{
    vert_grades = G->grades;
    qsort(G->order, G->n, sizeof(u32), comp_grades);
    return 0;
}

int comp_grades(const void *v1, const void *v2) {
    u32 degree1 = vert_grades[*(const u32 *)v1 - 1];
    u32 degree2 = vert_grades[*(const u32 *)v2 - 1];
    printf("degree2: %u\n", vert_grades[*(const u32 *)v2 - 1]);
    if (degree1 > degree2)
    {
        return -1;
    }
    else if (degree1 < degree2)
    {
        return 1;
    }
    else
    {
        return 0;
    }
}

pd: на данный момент я не хочу заказывать оценки G->

1 Ответ

1 голос
/ 22 апреля 2019

У вас есть массив

G->order = [0,2,3,4,5,6]

Обратите внимание, что у ваших массивов есть 6 элементов, поэтому диапазон их индексации должен быть либо 0..5, либо 1..6. Ваша cmp функция предполагает последнее, потому что она вычитает 1 из индекса.

Но у упорядочивающего массива есть диапазон 0..6, который не подходит ни одной из систем. В этом случае первое значение 0 нарушит границы массива, поскольку вы вычитаете 1.

Я предлагаю исходные данные перед сортировкой должны быть

G->order = [1,2,3,4,5,6]
...