Milan Stephan
Fotografie & IT

Zurück zur SP1 Übersicht

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;
}