0

を使用して構造体の配列をソートしようとしていますqsort()が、イライラすることに、機能していません。のマンページを読みましたがqsort()、構文的には問題ないように見えるコンパレータ関数があると思いますが、を呼び出した後に「並べ替えられた」配列を出力すると、配列qsort()に何も並べ替えられません。

コード:

#include <stdlib.h>
#include <stdio.h>

#define ARRAY_SZ 5

typedef struct SingleChar
{
    unsigned char Character;
    unsigned int Weight;
} *SingleCharPtr;

int CompareWeights(const void *a, const void *b)
{
    const SingleCharPtr p1 = (SingleCharPtr)a;
    const SingleCharPtr p2 = (SingleCharPtr)b;

    // printf("Weight1: %u\tWeight2: %u\n", p1->Weight, p2->Weight);
    // return (p1->Weight - p2->Weight);

    if (p1->Weight < p2->Weight)
        return -1;
    else if (p1->Weight > p2->Weight)
        return 1;
    else
        return 0;
}


SingleCharPtr MakeChar(unsigned char c, unsigned int w)
{
    SingleCharPtr scptr = malloc(sizeof(struct SingleChar));

    if (!scptr)
    {
        fprintf(stderr, "[Error] Out of memory\n");
        exit(1);
    }

    scptr->Character = c;
    scptr->Weight = w;

    return scptr;
}

int main(void)
{
    SingleCharPtr *chars = malloc(ARRAY_SZ * sizeof(SingleCharPtr));

    chars[0] = MakeChar('B', 3);
    chars[1] = MakeChar('E', 7);
    chars[2] = MakeChar('A', 4);
    chars[3] = MakeChar('D', 6);
    chars[4] = MakeChar('C', 2);

    qsort(chars, ARRAY_SZ, sizeof(SingleCharPtr), &CompareWeights);

    int i;
    for (i = 0; i < ARRAY_SZ; i++)
    {
        printf("Character: %c\tWeight: %u\n", chars[i]->Character, chars[i]->Weight);
        free(chars[i]);
    }

    free(chars);

    return 0;
}

また、コンパレータ関数 ( CompareWeights()) で、 が指す構造体の重みを出力するとSingleCharPtr、すべて 0 になることがわかりました。

正しい方向へのポインタは高く評価されます。

4

2 に答える 2