C 三维阵列的内置比较功能

C 三维阵列的内置比较功能,c,casting,multidimensional-array,C,Casting,Multidimensional Array,我最近删除了一个类似的问题(如果有人在回答,我很抱歉),我找到了一个在这个比较函数中跳过警告(学究标志打开)的解决方案: 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 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;
}
#包括
#包括
内部组件(常数无效*pa,常数无效*pb)
{
常量int(*a)[2]=(无效*常量)pa;
常量int(*b)[2]=(void*const)pb;
报税表(a[0][0]+a[1][0])-(b[0][0]+b[1][0]);
}
内部主(空)
{
INTA[][2][2]={
{{1,2},{3,4}},
{{3,4},{5,6}},
{{2,3},{4,5}},
};
尺寸i,n=sizeof(a)/sizeof(a[0]);
对于(i=0;i
现在它似乎在没有警告的情况下按预期工作,但我不了解演员阵容,
为什么
(void*const)pa
而不是
(const void*)pa
我无法解释为什么gcc做得不对
const void*
表示指向不可修改数据的非类型指针。不要与
void*const
混淆,它是指向非类型化数据的不可修改指针。你的声明应该有效

但不幸的是,在紧要关头,你可以这样做:

int const (*a)[2] = (int const (*)[2])pa;
第二个参数也是如此。很可怕,但至少它压制了你的警告。如果我知道为什么会发生这种事,或者有更聪明的占卜师想插话,我一定会发回这里


最好的。

指向void(
void*const
)的常量指针与指向常量void(
void const*
const void*
)的指针有所不同。所以这是不对的?你用cast欺骗编译器。你要在我找到可以玩的装备之前解决这个问题,为此,我很抱歉,因为这会让我感到困扰,直到我看到它。不幸的是,我需要睡一会儿。在绝对困难的情况下,您可以将强制转换放回原处,但只要您这样做,就可以将其转换为正确的类型,
int-const(*a)[2]=(int-const(*)[2])pa。我将此添加书签以查看它。我工作时有一个ubuntu盒子,明天(实际上是今天)我可以玩,所以如果有机会,我会多玩一点。这对我来说很奇怪。祝你好运。