go to start Ex W3
|home |print view |recent changes |changed March 10, 2017 |
exact
|You are 54.81.59.211 <- set your identity!

Sections: !BoundedBuffer | Einführung | Member Definitionen (Signaturen) | Verhalten eines default-konstruierten Buffers | Inhalt des Buffers | Konstruktoren | Vorgaben |

BoundedBuffer ^

In dieser Aufgabe erstellen Sie schrittweise die grundlegende Datenstruktur für einen BoundedBuffer. Ihre Implementation wird die erste Testatabgabe sein. Sie können das Testat in Gruppen von bis zu drei Studenten abgeben:

Einführung ^

BoundedBuffers werden in einer Umgebung eingesetzt, in welcher Producer und Consumer eine gemeinsame Datenstruktur zur Austausch von Elementen verwenden. Der BoundedBuffer hat eine fixe Grösse und wird als FIFO-Queue implementiert. Für einen Consumer ist es wichtig, dass er nicht Daten aus einem leeren Buffer auslesen kann. Der Producer auf der anderen Seite darf nicht in einen vollen Buffer hineinschreiben.

Ihre Implementation wird auf einem Array (std::array) basieren und der Funktionsweise eines Circular Buffers entsprechen.

 

Folgende Member Funktionen muss ihr BoundedBuffer aufweisen:

Folgende Member Typen muss ihr BoundedBuffer haben:

Sie erhalten für jede Aufgabe Test-Suiten. Wir empfehlen Ihnen jeweils nur einen einzelnen Test hinzuzunehmen (die nachfolgenden auskommentieren). Meistens wird dies zu einer Red-Bar führen. Implementieren Sie nur so viel Code, dass Sie wieder eine Green-Bar erhalten. Fügen Sie anschliessend den nächsten Test hinzu.

Member Definitionen (Signaturen) ^

Implementieren Sie zuerst die Deklarationen der Member von BoundedBuffer ohne Logik, um einen kompilierfähigen BoundedBuffer Typ zu erhalten.

Tipp: Wenn Sie sich bei den Signaturen der Member Funktionen unsicher sind, können Sie sich bei denjenigen von Queue inspirieren lassen.

Anmerkung: Wir haben einige Tests zur Verfügung gestellt, welche nicht wirklich sinnvoll für ein reales Test-Szenario sind. Sie helfen Ihnen jedoch die Member direkt richtig zu deklarieren, so dass Sie sie später nicht mehr anpassen müssen. Diese Tests sind von Boost (type_index.hpp) abhängig. Entsprechend sollte die Boost-Library auf dem System installiert oder im Projekt eingebunden werden. Vorsicht! Die Boost-Headers eines CUTE Projekts (Häkchen im Wizard) reichen nicht für diese Test-Cases.

Verhalten eines default-konstruierten Buffers ^

Implementieren Sie nun das Verhalten der Member-Funktionen für einen default-konstruierten Buffer. Vermeiden Sie dabei Undefined Behavior!

Inhalt des Buffers ^

Da das Buffer-Interface jetzt steht, können Sie die benötigte Logik implementieren. Sie haben beim Array-basierten zirkulären Buffer zwei Möglichkeiten, wie sie diesen realisieren. Dies wissen Sie jedoch bereits aus Algorithmen & Datenstrukturen. Eine kurze Zusammenfassung:

Die letztere Variante ist einfacher zu implementieren und verständlicher zu lesen. Sie können aber auch die erste Variante nehmen, dann müssen Sie den Test, welcher den Typ BoundedBuffer::container prüft aber anpassen.

Ansonsten sollte das Verhalten des Buffers selbsterklärend sein:

Verwenden Sie für den Elementzugriff vom Array möglichst die at()-Funktion, damit Sie sehen, falls Sie versehentlich auf ein Element ausserhalb des gültigen Bereichs zugreifen.

Weiter gibt es noch eine Test-Suite, welche sicherstellt, dass die Elemente mit den richtigen Operationen verschoben und kopiert werden. Diese Suite arbeitet mit einem Objekt welches die Memory-Operationen aufzeichnet und schlussendlich prüft, ob die erwarteten Copy/Move-Operationen verwendet wurden.

Konstruktoren ^

Die impliziten-Konstruktoren genügen für die Implementation bis anhin. Implementieren diese nun selber, so dass jeweils die passende Operation auf die Elemente angewendet wird, so wie es die impliziten Konstruktoren auch machen. Implementieren Sie die folgenden Special Member Functions:

Später werden wir den BoundedBuffer abändern, so dass er mit Heap-Memory arbeitet und dann werden wir die eigenen Konstruktoren benötigen.

Vorgaben ^

Da Sie nun alles durchgelesen haben, hier ist das Archiv mit den vorgegeben Dateien:

https:files/Vorgabe_BoundedBuffer.zip

Erstellen Sie ein neues CUTE Executable Projekt und legen Sie die Dateien des Archivs im src-Verzeichnis ab. Die Datei BoundedBuffer.h müssen Sie selber erstellen.


|home |print view |recent changes |changed March 10, 2017 |
exact
|You are 54.81.59.211 <- set your identity!

Ex W3
go to start