2

同様の質問を最近削除しました(誰かが答えていたらごめんなさい)、この比較関数で警告をスキップする(ペダンティックフラグをオンにする)解決策を見つけました:

int comp(const void *pa, const void *pb)
{
    const int (*a)[2] = pa;

警告:

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

キャストを使用して解決:

const int (*a)[2] = (void * const)pa;

完全なコード:

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

int comp(const void *pa, const void *pb)
{
    const int (*a)[2] = (void * const)pa;
    const int (*b)[2] = (void * const)pb;

    return (a[0][0] + a[1][0]) - (b[0][0] + b[1][0]);
}

int main(void)
{
    int a[][2][2] = {
        {{1,2},{3,4}},
        {{3,4},{5,6}},
        {{2,3},{4,5}},
    };
    size_t i, n = sizeof(a) / sizeof(a[0]);

    for (i = 0; i < n; i++) {
        printf("%d\n", a[i][0][0] + a[i][1][0]);
    }
    qsort(a, n, sizeof(a[0]), comp);
    printf("Sorted:\n");
    for (i = 0; i < n; i++) {
        printf("%d\n", a[i][0][0] + a[i][1][0]);
    }
    return 0;
}

警告なしで期待どおりに動作するようになりましたが、キャストがわかりません(void * const)pa(const void *)pa

4

1 に答える 1