The C standard library
Wir haben bereits mit Funktionen wie printf
und malloc
gearbeitet. C verfügt über viele nützliche Libraries, die auf deinem System schon vorinstalliert sind. Erfinde das Rad nicht neu!
Diese Seite kann einen Überblick über die C Standard Library und ihre Funktionen verschaffen. Eine genauere Dokumentation zu den Funktion bekommst du mit dem Linux Befehl man
oder online
Multithreading
Durch die Verwendung von threads kann ein Programm nebenläufig ausgeführt werden. Dies ist besonders nützlich, wenn wir einige Operationen haben, die sehr zeitintensiv sind, wie z.B. das Warten auf eine Benutzereingabe: wenn gleichzeitig auch weitere Berechnungen durchgeführt werden müssen, wäre das einfache Warten auf die Eingabe eine Zeitverschwendung. In diesem Fall können wir einen neuen Thread erstellen, der die Benutzereingabe verarbeitet, und unser Programm kann in der Zwischenzeit das tun, was es tun muss.
Multithreading in C wird von der pthreads API verwaltet.
Um mehr Informationen zu erhalten und Codebeispiele zu sehen, lies dies
Networking
Für alle, die ein Multiplayer-Spiel implementieren wollen oder einen Dienst, auf den ferngesteuert zugegriffen werden kann:
Beej’s Guide to Network Programming
Data structures
Datenstrukturen ermöglichen es, Daten zu organisieren und effizient auf sie zuzugreifen. Geeks for Geeks bietet einen guten Überblick über die Datenstrukturen, die für dich nützlich sein könnten.
Leider sind die einzigen Datenstrukturen, die bereits in C eingebaut sind, Arrays. Doch die meisten Datenstrukturen sind zum Glück einfach genug, um selbst implementiert zu werden. Obwohl Datenstrukturen, die auf Linked Lists basieren, sehr intuitiv sind, sollte eine Lösung, die auf Arrays basiert, aufgrund der immens besseren Leistung immer bevorzugt werden ( lies dies, falls du wissen willst, warum das so ist).
Um die statische Charakteristik von Arrays zu umgehen, werden dynamische Arrays (oder Vektoren) verwendet. Die Idee dabei ist, dass wir für unser Array mehr Speicher reservieren, als wir tatsächlich benötigen, so dass wir nur im Falle einer großen Anzahl von Einfügungen alle unsere Daten in ein neues Array kopieren müssen. Überlege dir, ob du selbst eine dynamische Array-Implementierung schreiben willst, denn das wird sicherlich irgendwann einmal nützlich sein. Alternativ kannst du dir eine Implementierung von GitHub holen, z.B. [diese hier] (https://github.com/eteran/c-vector).
Im Allgemeinen ist eine Hashmap (oder Dictionary) die effizienteste Art, ungeordnete Daten zu speichern und darauf zuzugreifen. Ich empfehle dir, keine eigene Hash-Map zu schreiben und stattdessen diese zu verwenden.
Funktionspointer
Nicht nur normale Variablen leben an einer Adresse, Funktionen tatsächlich auch. Das heißt, Funktionen können als Pointer auch als Parameter anderen Funktionen weitergegeben werden. Sogenannte Funktionspointer können benutzt werden, um eleganteren Code zu Schreiben.