Filter: 2013

Zustandsmaschine

Zustandsmaschinen definieren Aktionen in Abhängigkeit von vorhergehenden Aktionen bzw. eingenommen Zuständen. Sie finden immer da Verwendung, wo es eine endliche Anzahl von Zuständen und Aktionen geben kann. Dies sind unter Anderem: Datenparser, Maschinensteuerungen, Verbindungsprotokolle oder auch Spielelogik.

Beispiel (Quellcode): statemachine.cpp
Download (Quellcode): statemachine.zip

Beschreibung

Beispiel für eine Zustandsmaschine zum Verbindungsaufbau Wie bereits erwähnt, benutzen Zustandsmaschinen die vorhergehenden Zustände bzw. den letzten Zustand, um eine Aktion im aktuellen Kontext durchführen zu können. Meist wird eine Aktion durch eine Eingabe in das Zustandssystem ausgelöst. Da nur eine limitierte Anzahl von Aktionen möglich ist, können je nach Zustand/Kontext verschiedene Dinge verboten, erlaubt oder in ihrer Funktion verändert sein. Dies lässt sich gut für Sicherheitsfunktionen verwenden (zum Beispiel für eine Authentifizierung).

Eine Zustandsmaschine kann von einem Zustand in einen Anderen überführt werden, dies muss nicht zwangsläufig der näc…

Festkommazahl

Die Festkommazahl wird in Bereichen verwendet, in denen die CPU-Architektur keine bzw. nur langsame Fließkommazahlen anbietet oder wo die Präzision des Ergebnisses wichtig ist. Häufig in verschiedener Hardware eingegossen, da einfacher zu handhaben als Fließkommazahlen, in älteren Spielen und im Finanzbereich zu finden.

Beispiel (Quellcode): fixedpoint.cpp
Download (Quellcode): fixedpoint.zip

Beschreibung

Beispiel für Festkommazahl in dezimaler und binärer Ausführung Die Festkommazahl wird durch eine Ganzzahl gehalten, die mindestens so groß sein muss, dass sie die Stellenanzahl (Vor- und Nachkommastellen) aufnehmen kann. Auch die Genauigkeit hängt direkt von der Anzahl der Nachkommastellen ab, daher wird hier meist der Mittelweg zwischen der Größe der Ganzzahl und der Genauigkeit gesucht. Häufig wird zwischen binären und dezimalen Festkommazahlen unterschieden, obwohl natürlich alle möglichen Basen benutzt werden können. Wenn die richtige Basis gewählt ist, besteht die Möglichkeit ohne Rundung eine Zahl vom möglichen Zahlenbereich aufzunehmen.

Unabhängig davon was…

Dynamischer Datentyp / Variant

Dynamische Datentypen, oft als Variant bezeichnet, können eine definierte Anzahl von verschiedenen Datentypen aufnehmen. Die dienen in der Regel als Behälter, zur Datentypumwandlung oder zur Serialisierung von Datentypen und Strukturen. Sie sind in einer Vielzahl von Programmiersprachen vertreten, vor allem in Skriptsprachen wie zum Beispiel JavaScript, PHP und LUA. Sie sind immer da zu finden, wo es weniger um Laufzeit als um Einfachheit geht. Einfach in der Verwendung aus dem Grund, dass der Behälter automatische Typumwandlungen und Manipulationsfunktionen für die enthaltenen Daten mitbringen kann.

Beispiel (Quellcode): variant.cpp
Download (Quellcode): variant.zip

Beschreibung

Variant-Datenstruktur während der Benutzung Der Behälter für den dynamischen Datentyp, besteht in den meisten Fällen aus einem Typindikator und den einzelnen Datentypen, die dieser aufnehmen kann. Beim Setzen eines Wertes für einen der enthaltenen Datentypen, wird der Typindikator mitgesetzt. Zum Auslesen wird anhand des Typindikators geprüft, ob eine Typumwandlung erford…

Am längsten nicht verwendetes Objekt / LRU

Diese oder abgewandelte Datenstrukturen finden sich in vielen Speichermanagementteilen von Betriebsystemen, Grafik-/Audiokernen von Spielen und auch im "Zuletzt geöffnet"-Menüpunkt der Mehrzahl der Dateibearbeitungsprogramme wieder. Hierdurch kann unter anderem, die Benutzung knapper Resourcen eingeschränkt werden.

Beispiel (Quellcode): lru.cpp
Download (Quellcode): lru.zip

Beschreibung

LRU / Am längsten nicht verwendetes Objekt während des Befüllens Die Datenstruktur bildet eine Liste, bei denen die Referenzen (oder auch die Objekte) mit begrenzter Anzahl gehalten werden. Wird ein Objekt benutzt, wird die Objektreferenz an den Anfang der Liste verschoben. Ist die Referenz noch nicht in der Liste, wird sie an den Anfang der Liste eingefügt. Ist die Liste zu lang, werden die Objekte am Listenende verworfen.

Abwandlungen:

  • Alternativ kann anstelle der Verschiebung der benutzen Objektreferenz an die erste Position, auch eine schrittweise Umpositionierung stattfinden. So nähert sich die Referenz langsamer den Listenkopf, was je nach Fall bessere Ergebnisse erzielen kann…

Ringpuffer

Der Ringpuffer ist ein FIFO-artiger Datenspeicher, der meist ein Datenfeld fester Größe benutzt. Dadurch benötigen zeitkritische Abläufe, keinen Zugriff auf die Speicherverwaltung. Ringpuffer werden gerne, bei Audiotreibern, Eventsystemen oder zum Datenaustausch zwischen zwei nebenläufigen Prozessen benutzt.

Beispiel (Quellcode): ringbuffer.cpp
Download (Quellcode): ringbuffer.zip

Beschreibung

Ringpuffer Schaubild Durch zwei Zähler werden die Lese- und Schreibposition dargestellt. Wird ein Element ausgelesen, wird die Leseposition erhöht. Beim Hinzufügen eines Elements, erhöht sich die Schreibposition. Beim Erreichen des Datenfeldlimits, wird die Position auf den Anfang des Feldes zurückgesetzt. Alternativ kann auch ein Modulo oder eine andere Operation sicherstellen, dass die Position innerhalb des Datenfelds liegt und fortlaufend ist. Sind beide Positionen gleich, ist das Feld leer. Wären nach dem nächsten Hinzufügen beide Position gleich, ist das Feld voll.

Zum Austausch zwischen zwei Prozessen, bei denen einer der Daten…