gpt4 book ai didi

c - qsort 结构数组

转载 作者:行者123 更新时间:2023-12-02 22:30:55 25 4
gpt4 key购买 nike

我尝试对下面的一个struct进行排序,目的是对它们的错误率进行排序,同时保留sid和did的信息。虽然没有编译错误,但我在运行时遇到段错误。我想知道出了什么问题....

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

struct linkdata {
int sid;
int did;
double err;
};
typedef struct linkdata LD;
typedef int (*qsort_func_t)(const void *, const void *);

static int compareByErr (const void * a, const void * b)
{
fprintf(stderr, "aerr=%.3f, berr=%.3f\n", (*(LD**)a)->err, (*(LD**)b)->err);
int aerr = (*(LD**)a)->err;
int berr = (*(LD**)b)->err;

return aerr - berr;
}

int main() {

int idx;
int numnode;
struct linkdata* perr;
qsort_func_t qsort_func = compareByErr;

numnode = 3;
perr = (LD*) malloc (numnode*numnode*sizeof(LD));

perr[0].sid = 0; perr[0].did = 1; perr[0].err = 0.642;
perr[1].sid = 0; perr[1].did = 2; perr[1].err = 0.236;
perr[2].sid = 0; perr[2].did = 3; perr[2].err = 0.946;
idx = 3;

qsort(perr, idx, sizeof(perr), compareByErr);

int i;
for (i=0; i<idx; i++){
fprintf(stderr,"err[%d][%d] = %.3f\n", perr[i].sid, perr[i].did, perr[i].err);
}

free(perr);
}

最佳答案

代码中有很多错误。

1。比较错误

compareByErr函数的ab参数是LD*的对象,不是 LD**。你做了一个不必要的取消引用。尝试将该功能更改为:

static int compareByErr (const void * a, const void * b)
{
fprintf(stderr, "aerr=%.3f, berr=%.3f\n", ((LD*)a)->err, ((LD*)b)->err);
int aerr = ((LD*)a)->err;
int berr = ((LD*)b)->err;

return aerr - berr;
}

2。比较错误

还有另一个问题,您将 double 隐式转换为 int。由于所有这些“错误”都是 0.????,它们都将被截断为 0。使整个数组未排序。将其更改为:

    double aerr = ((LD*)a)->err;
double berr = ((LD*)b)->err;

return aerr < berr ? -1 : aerr > berr ? 1 : 0;

3。分配

您正在分配 3 个2 个节点,但只需要 3 个。将其更改为

perr = (LD*) malloc (numnode * sizeof(LD));

4。排序

第三个参数是数组中每个元素的大小,而不是 sizeof(perr),它只是一个指针的大小(4 个字节)。将该行更改为:

qsort(perr, idx, sizeof(*perr), compareByErr);
// ^

实际获取元素大小。

idx 似乎是不必要的。您可以在此处使用 numnode

关于c - qsort 结构数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12296773/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com