Ваша вторая возможная функция compare()
должна работать, если только я не заметил разницы между ней и этой версией чуть ниже. При сортировке массива указателей функция сравнения передает два указателя в dataStream *
, поэтому компаратор должен быть очень похож на это:
int compare (const void *a, const void *b)
{
const dataStream *x = *(const dataStream **)a;
const dataStream *y = *(const dataStream **)b;
if (x->amc > y->amc)
return(1);
else if (x->amc < y->amc)
return(-1);
else
return(0);
}
Также, как изначально написано, одна из ваших функций всегда возвращает 0, потому что x->amc == x->amc
(вы разыменовываете x
дважды вместо x
и y
).
Ваш тестовый код не полностью инициализирует структуры данных - он использует calloc()
, поэтому все строки и указатели в структурах обнуляются, поэтому сортировка мало что делает.
Этот код работает для меня ... как насчет вас?
#include <stdio.h>
#include <stdlib.h>
typedef struct s_stream
{
int amc;
char *name;
} dataStream;
static int compare(const void *a, const void *b)
{
const dataStream *x = *(const dataStream **)a;
const dataStream *y = *(const dataStream **)b;
if (x->amc > y->amc)
return(1);
else if (x->amc < y->amc)
return(-1);
else
return(0);
}
static void dump(FILE *fp, const char *tag, dataStream * const * const data, int num)
{
const char *pad = "";
fprintf(fp, "Stream Dump (%s): (%d items)\n", tag, num);
for (int i = 0; i < num; i++)
{
fprintf(fp, "%s%d", pad, data[i]->amc);
if (i % 10 == 9)
{
putc('\n', fp);
pad = "";
}
else
pad = ", ";
}
putc('\n', fp);
}
static void abc(void)
{
int count = 100;
dataStream *_UniqueStreamBuild = calloc(count, sizeof(dataStream ));
dataStream **UniqueStreamBuild = calloc(count, sizeof(dataStream *));
for ( int i = 0; i < count; ++i)
{
UniqueStreamBuild[i] = _UniqueStreamBuild + i;
UniqueStreamBuild[i]->amc = (7 * i + 3) % count + 1;
}
dump(stdout, "Before", UniqueStreamBuild, count);
qsort(UniqueStreamBuild, count, sizeof(dataStream *), compare);
dump(stdout, "After", UniqueStreamBuild, count);
free(_UniqueStreamBuild);
free(UniqueStreamBuild);
}
int main(void)
{
abc();
return 0;
}