isort.c
#include <stdlib.h> #include <stdio.h> #define NUM 8 // Wichtig: Die Fehlerbehandlung wurde hier weggelassen. // Der Code soll die Funktionsweise erklären und // so gut nachvollziehbar wie möglich sein. // In euren Abgaben bitte dran denken! ;) // Vergleichsfunktion. Gibt's weiter unten. ;) static int intcompare(const void *, const void *); int main(void) { // Array mit *Pseudo*-Zufallszahlen anlegen und befüllen int data[NUM]; for (int i = 0; i < NUM; i++) { data[i] = rand(); } // Unsortiertes Array ausgeben printf("Unsortiert:\n"); for (int i = 0; i < NUM; i++) { printf("%d\n", data[i]); } printf("\n"); // Diese Zeile ist für das Sortieren zuständig. // Parameter: 1: Das zu sortierende Array // 2: Zahl der Elemente im Array // 3: Größe eines Elements im Array // 4: Zeiger auf die Vergleichsfunktion qsort(data, NUM, sizeof(int), &intcompare); // Sortiertes Array ausgeben printf("Sortiert:\n"); for (int i = 0; i < NUM; i++) { printf("%d\n", data[i]); } fflush(stdout); } // qsort übergibt der Vergleichsfunktion *Zeiger auf* die zu vergleichenden Elemente. // Durch die generische Schnittstelle werden die Argumente als void* übergeben // und müssen demnach erst wieder in den richtigen Zeigertyp umgewandelt werden. static int intcompare(const void *va, const void *vb) { // Die Parameter müssen jetzt auf den richtigen Typ gecastet werden. // Im Eingabearray sind in diesem Fall int-Werte gespeichert. Die // Vergleichsfunktion erhält Zeiger auf zwei dieser int-Werte, // verpackt in je einem "const void *". // Jetzt casten wir die Parameter zu "Zeiger auf den erwarteten Typ". // Da wir int-Werte vergleichen wollen, casten wir die Parameter auf int*. // (Bei Strings (char*) wäre es dementsprechend char**.) const int *ia = (const int *) va; const int *ib = (const int *) vb; // Um die hinter den Zeigern stehenden Zahlen zu bekommen, // müssen die Zeiger dereferenziert werden. const int a = *ia; const int b = *ib; // Der Vergleich an sich. Hiervon macht qsort abhängig, wie sortiert wird. // (Hier könnte man auch die Differenz zurückgeben) if (a < b) { return -1; } if (a > b) { return +1; } return 0; }