Проблема с Qsort-структурой - PullRequest
       41

Проблема с Qsort-структурой

0 голосов
/ 02 сентября 2018

Итак, я открыл файл 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);

1 Ответ

0 голосов
/ 02 сентября 2018

Изменение

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

Для

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

Или

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

Поскольку размер указателя не всегда совпадает с размером структуры.

...