====== 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.