【问题标题】:Issue with Qsort-ing a StructQsort-ing 结构的问题
【发布时间】:2018-09-02 10:31:24
【问题描述】:

所以我打开了一个 CSV 文件,并将其添加到一个结构中。我现在想通过它的 U 值从最低到最高对结构进行排序。我所做的有些工作,但它交换了不打算交换的值,例如 x 和 y,但仍按 U 排序。 我的结构 -

typedef struct {
    float xvalue;
    float yvalue;
    float uvalue;
    float vvalue;
} flow_data;

int num_compare(const void *v1, const void *v2)
{
    const flow_data *p1 = (flow_data *)v1;
    const flow_data *p2 = (flow_data *)v2;
    if (p1->uvalue < p2->uvalue)
        return -1;
    else if (p1->uvalue > p2->uvalue)
        return +1;
    else
        return 0;
}

我在哪里运行代码 -

FILE* fp = fopen(flow_file, "r");

// Checking if the file has been read succesfully
if( fp == NULL)
{
    perror("Error opening file");
    exit(1);
}

char buf[500];
fgets(buf, sizeof(buf), fp); // Skip the first line

int total = 0;
flow_data d;
flow_data* dataset = NULL;

while(4 == fscanf(fp, "%f, %f, %f, %f\n", &d.xvalue, &d.yvalue, &d.uvalue, &d.vvalue))
{
    dataset = realloc(dataset, sizeof(*dataset) * (total + 1));
    dataset[total] = d;
    total++;
}

qsort(dataset, total, sizeof(dataset), num_compare);

【问题讨论】:

  • 你打电话给qsort()时不应该是sizeof(*dataset)吗?
  • flow_data* dataset,所以dataset 是一个指针。现在你使用qsort(dataset, total, sizeof(dataset), num_compare); 的地方相当于qsort(dataset, total, sizeof(a_pointer), num_compare); 你需要像上面提到的@squeamishossifrage 那样取消引用dataset
  • 下面的解决方案是否足够改变?
  • @tobytob​​ias 是的,因为sizeof(*dataset) == sizeof(flow_data)。但是您应该使用sizeof(*dataset),因为这会使您的代码更清晰(因为无需检查flow_data 是否是正确的类型)并且更易于维护(因为您可以调整此代码以使用不同的数据类型)轻松)。

标签: c struct qsort


【解决方案1】:

改变

qsort(dataset, total, sizeof(dataset), num_compare);

qsort(dataset, total, sizeof(flow_data), num_compare);

或者

qsort(dataset, total, sizeof(*dataset), num_compare);

因为指针的大小并不总是与结构的大小相同。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-12
    • 1970-01-01
    • 1970-01-01
    • 2021-06-05
    相关资源
    最近更新 更多