?
Hallo,
was hälst du von folgender Lösung? Die Funktion hat eine Signatur analog zu qsort aus der Standardbibliothek; sie kann auf Arrays beliebigen Typs abgeschossen werden und auch die Vergleichsfunktion wird übergeben.
Grüße
Martin
#include <stdlib.h>
#include <stdio.h>
#define UNORDERED 0
#define ASCENDING 1
#define DESCENDING 2
int asc_descending(void *base, size_t nmemb, size_t size,
int (*compar) (const void *, const void *))
{
register unsigned char *i, *r;
int res = ASCENDING | DESCENDING;
i = r = base;
r += --nmemb * size;
while (i < r) {
int c = (*compar) (i, i + size);
if (c < 0)
res &= ~DESCENDING;
else if (c > 0)
res &= ~ASCENDING;
i += size;
}
return res;
}
static int cmp(const void *p1, const void *p2)
{
return *(const int *)p1 - *(const int *)p2;
}
int main()
{
int v[] = { 0, 1, 1, 2, 3, 5, 8 };
/* int v[] = { 8, 5, 3, 2, 1, 1, 0 }; */
/* int v[] = { 8, 5, 0, 1, 3, 2, 1 }; */
size_t n = sizeof(v) / sizeof(int);
switch (asc_descending(v, n, sizeof(int), &cmp)) {
case ASCENDING:
printf("aufsteigend\n");
break;
case DESCENDING:
printf("absteigend\n");
break;
case UNORDERED:
printf("unsortiert\n");
break;
default:
printf("Autsch!\n");
}
return EXIT_SUCCESS;
}