Додому Internet & IT Programmierung Erstellen benutzerdefinierter C-Bibliotheken von Grund auf

Erstellen benutzerdefinierter C-Bibliotheken von Grund auf

3

C ist eine abgespeckte Sprache. Es gibt Ihnen das blanke Metall. Es enthält nicht einmal Funktionen zum Lesen von einer Tastatur oder zum Schreiben auf einem Bildschirm. Wenn du das willst, musst du es bauen.

Alles, was über die absoluten Grundlagen hinausgeht, lebt in Bibliotheken.

Sie kennen die stdio -Bibliothek. Es verarbeitet die Standardeingabe und -ausgabe. Es gibt andere für Mathematik. String-Handhabung. Zeitmanipulation. Sie existieren, damit Sie das Rad nicht jedes Mal neu erfinden müssen, wenn Sie ein neues Projekt starten.

Aber warum sollte man sich auf die Vorgaben des Standards beschränken?

Durch das Einfügen von Code in Bibliotheken wird dieser wiederverwendbar. Damit können Sie umfangreiche Programme in überschaubare Module aufteilen. Einfacher zu testen. Einfacher zu debuggen. Sie können Code aus Ihren alten Projekten abrufen und in neue Projekte einfügen, ohne Logikblöcke kopieren und einfügen zu müssen.

Schauen wir uns an, wie das geht.

Logik in Funktionen extrahieren

Nehmen Sie ein Standard-C-Programm, das ein Array mit Zufallszahlen füllt und diese sortiert. Hier ist der Rohcode:

„c

int a[MAX];
int rand_seed=10;

int rand() / von K&R – erzeugt eine Zufallszahl zwischen 0 und 32767. /
{
rand_seed = rand_seed * 1103515245 +12345;
return (unsigned int)(rand_seed / 65536) % 32768;
}

void main()
{
int i,t,x,y;
/ Array füllen /
für (i=0; i < MAX; i++) { a[i]=rand(); printf("%d\n",a[i]); } / Blase sortiert das Array /
für (x=0; x < MAX-1; x++) für (y=0; y < MAX-x-1; y++) if (a[y] > a[y+1])
{
t=a[y];
a[y]=a[y+1];
a[y+1]=t;
}
/ sortiertes Array drucken /
printf(“——————–\n”);
für (i=0; i < MAX; i++) printf("%d\n",a[i]); } „

Dieser Code macht drei Dinge. Es füllt ein Array mit Zufallszahlen. Es sortiert sie mithilfe einer Blasensortierung. Es gibt das Ergebnis aus.

Um eine wiederverwendbare Bibliothek zu erstellen, müssen wir die Sortierlogik isolieren.

Schritt eins: Verallgemeinern Sie die Sortierung

Extrahieren Sie den Bubble-Sortiercode. Verwandeln Sie es in eine Funktion.

Da das Array „a“ ​​und die Konstante „MAX“ global sind, benötigt die Funktion zunächst keine Parameter. Es muss auch kein Wert zurückgegeben werden. Verwenden Sie einfach lokale Variablen für „x“, „y“ und „t“.

„c
void bubble_sort(int m)
{
int x,y,t;
für (x=0; x < m-1; x++) für (y=0; y < m-x-1; y++) if (a[y] > a[y+1])
{
t=a[y];
a[y]=a[y+1];
a[y+1]=t;
}
}

Aktualisieren Sie nun „main“, um diese Funktion aufzurufen, anstatt die Inline-Schleife auszuführen.

„c
void main()
{
int i,t,x,y;
/ Array füllen /
für (i=0; i < MAX; i++) { a[i]=rand(); printf("%d\n",a[i]); } bubble_sort(MAX); / sortiertes Array drucken /
printf(“——————–\n”);
für (i=0; i < MAX; i++) printf("%d\n",a[i]); } „

Es funktioniert. Aber es ist immer noch an ein globales Array gebunden.

Schritt zwei: Übergeben Sie das Array

Wir können die Sortierfunktion wirklich generisch gestalten. Übergeben Sie das Array selbst als Parameter.

Die Signatur ändert sich zu:

„c
bubble_sort(int m, int a[])

Dies weist den Compiler an, ein ganzzahliges Array beliebiger Größe zu akzeptieren. Der Hauptteil der Funktion bleibt genau gleich. Sie aktualisieren einfach den Aufruf in „main“:

„c
bubble_sort(MAX, a);

Fällt Ihnen etwas Seltsames auf? Wir übergeben „a“, nicht „&a“.

Auch wenn die Sortierfunktion das Array ändert, benötigen wir den Adressenoperator hier nicht. Es erscheint kontraintuitiv, wenn Sie es gewohnt sind, Sprachen mit Werten zu übergeben. Sie fragen sich vielleicht, warum dies ohne explizite Zeiger im Aufruf funktioniert.

Dies liegt daran, dass Arrays in C bei der Übergabe an Funktionen in Zeiger zerfallen. Die Funktion erhält einen Verweis auf den Anfang des Arrays im Speicher. Aus diesem Grund können die Originaldaten geändert werden.

Das Verständnis dieser Unterscheidung ist der Einstieg in die Beherrschung von Zeigern. Ohne sie sind C-Bibliotheken nur statische Codeblöcke. Damit bauen Sie modulare, tragbare Systeme.