====== Das Beispiel-Projekt ====== Wie in der [[why|Einleitung]] beschrieben, wollen wir einen kleinen Stack implementieren und testen. ===== Stack-Header ===== Hier nochmals der Header: class Stack { unsigned int * Buffer; unsigned int Size; unsigned int Position; public: Stack( unsigned int size ); ~Stack(); bool Push( unsigned int value ); bool Pop ( unsigned int & value ); inline unsigned int * GetBuffer() { return Buffer; } inline unsigned int GetSize() { return Size; } inline unsigned int GetUsed() { return Position; } }; ===== Stack-Implementierung ===== Und hier die Implementierung, die noch nicht ganz richtig funktioniert: #include "stack.h" Stack::Stack( unsigned int size ) : Size( size ) , Position( 0 ) { Buffer = new unsigned int [ size ]; } Stack::~Stack() { delete [] Buffer; } bool Stack::Push( unsigned int value ) { if( Position > Size ) return false; Buffer[ Position ] = value; Position ++; return true; } bool Stack::Pop ( unsigned int & value ) { Position--; value = Buffer[ Position ]; return true; } ===== Der aktuelle Stand der Implementation ===== Wird das Programm ausgeführt, Werden die Werte 1, 2 und 3 auf den Stack gelegt und wieder anschließend solange abgerufen, bis keine Werte mehr kommen. Leider funktioniert das Programm nicht richtig. Das Programm wird unter Linux abgebrochen: # ./program Wert: 3 Wert: 2 Wert: 1 Speicherzugriffsfehler Wir müssen also erkennen, dass unsere Implementation korrigiert wird und ein Test soll dafür sorgen, dass dieser Fehler nie wieder auftaucht. Der Speicherzugriffsfehler muss nicht sofort passieren! Auf einem Mac ergab sich beispielsweise folgende Ausgabe mit vollkommen willkürlichen Werten nach 3, 2, 1: Neo:stack_full xin$ ./program Wert: 3 Wert: 2 Wert: 1 Wert: 0 Wert: 0 Wert: 0 .... etwa 80 Zeilen gekürzt .... Wert: 0 Wert: 0 Wert: 0 Wert: 4096 Wert: 40 Wert: 0 Wert: 0 Wert: 0 Wert: 101 Wert: 1852791395 Wert: 1869376609 Wert: 1299475573 Wert: 1634100548 Segmentation fault ===== Download ===== Das Projekt ist in der fehlerhaften Form, wie hier beschrieben als {{:cpp:cppunit:stack_err.zip|ZIP-Archiv}} mit Makefile zum Download bereit.