You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用C语言qsort函数出现函数指针类型不兼容错误的解决方法

qsort函数指针类型不兼容问题修正

原代码

int cmp_arv(struct train *t1,
            struct train *t2)
{
    return (t1->arv - t2->arv);
}

void prepare_data(void)
{
    int i;

    for (i = 0; i < nconn; i++){
        rtrains[i].from = trains[i].to;
        rtrains[i].to = trains[i].from;
        rtrains[i].dpt = BIAS- trains[i].arv;
        rtrains[i].arv = BIAS- trains[i].dpt;
        rtrains[i].fare = trains[i].fare;
    }
    qsort (trains, nconn,sizeof(struct train), cmp_arv);
    qsort (rtrains, nconn, sizeof(struct train), cmp_arv);
}

错误信息

incompatible function pointer types passing 'int (struct train *, struct train *)'
to parameter of type 'int (* _Nonnull)(const void *, const void *)' [-Wincompatible-function-pointer-types]

问题原因

qsort的比较函数参数要求是**const void*类型**,这是为了保证通用性(适配任意数据类型的排序需求)。你定义的cmp_arv函数参数是struct train*,和qsort要求的函数指针类型不匹配,因此编译器抛出类型不兼容的错误。

修正后的代码

修改比较函数的参数类型为const void*,并在函数内部安全强制转换为const struct train*,同时保留原有排序逻辑:

int cmp_arv(const void *a, const void *b)
{
    const struct train *t1 = (const struct train *)a;
    const struct train *t2 = (const struct train *)b;
    // 若arv为大整数类型(如long),直接减法可能溢出,建议用下面的判断逻辑
    return t1->arv - t2->arv;
}

void prepare_data(void)
{
    int i;

    for (i = 0; i < nconn; i++){
        rtrains[i].from = trains[i].to;
        rtrains[i].to = trains[i].from;
        rtrains[i].dpt = BIAS - trains[i].arv;
        rtrains[i].arv = BIAS - trains[i].dpt;
        rtrains[i].fare = trains[i].fare;
    }
    qsort(trains, nconn, sizeof(struct train), cmp_arv);
    qsort(rtrains, nconn, sizeof(struct train), cmp_arv);
}

溢出安全版本(可选)

如果arv是可能溢出的整数类型(如long),建议改用判断逻辑避免溢出:

int cmp_arv(const void *a, const void *b)
{
    const struct train *t1 = (const struct train *)a;
    const struct train *t2 = (const struct train *)b;
    if (t1->arv < t2->arv) return -1;
    if (t1->arv > t2->arv) return 1;
    return 0;
}

内容的提问来源于stack exchange,提问作者mann

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 09:34:53