Objekt Programmierung |
18.11.2013, 23:08 | Auf diesen Beitrag antworten » | |||||
Man23 | Objekt Programmierung Meine Frage: Hallo ich habe gerade probleme bei einer Aufgabe: Ein Ringpuffer ist ein Speicher für Daten, der immer die gleiche Größe hat, egal wie viele Datenelemente wir hinzufügen. Der Grund dafür ist, dass in einem Ringpuffer gespeicherte Werte beim Auslesen wieder daraus entfernt werden. Eine praktische Anwendung findet der Ringpuffer z.B. bei der Kopplung von Datensystemen mit unterschiedlichen Verarbeitungsgeschwindigkeiten. Überträgt das sendende System seine Daten für einen kurzen, begrenzten Zeitraum schneller, als das empfangende System sie verarbeiten kann, so werden die Daten vom Empfänger zunächst in einem Ringpuffer zwischengespeichert. Nachdem die Datenrate des Senders wieder gesunken ist, kann der Empfänger die gepufferten Daten auslesen und weiter verarbeiten. Der Schreib-Index steht an der Position des nächsten freien Speicherelements. Bei einer Schreiboperation werden die Daten an diese Position geschrieben und der Index wird um eine Position inkrementiert. Sobald er das Ende des Speichers erreicht, wird er wieder auf das erste Element gesetzt (rechtes Bild). Der Lese-Index funktioniert analog. Er steht immer auf dem ersten, noch nicht gelesenen Element und wird inkrementiert, wenn das Element gelesen wird. Ein in den Ringpuffer geschriebenes Datenelement kann genau einmal wieder gelesen werden und sein Speicherplatz gilt nach dem Lesen wieder als frei. Wenn Schreib- und Lese-Index den gleichen Wert haben, ist der Puffer entweder voll oder leer, abhängig davon, ob der Wert des Füllstands des Puffers Null ist oder ob er der Speichergröße entspricht. Natürlich darf die Anzahl der Elemente, die gespeichert worden sind (Füllstand) die Speichergröße niemals überschreiten, sonst "überholt" der Schreib-Index den Lese-Index und Daten, die noch gar nicht gelesen sind, werden bereits wieder überschrieben. Es kommt zum Datenverlust. 1 Bereiten Sie ein h-File mit der Klassendefinition für CRingBuffer entsprechend des angegebenen UML-Klassendiagramms vor Aufgabe 2) Geben Sie die logischen Ausdrücke an, mit denen man testen kann, ob der Ringpuffer voll bzw. leer ist. Aufgabe 3 : Die Methode print soll nur die Elemente ausgeben, die tatsächlich im Ringpuffer gespeichert sind. Schreiben Sie den Code für die Schleife auf, die auf alle gespeicherten Elemente zugreift und diese mit cout ausgibt (die gespeicherten Elemente sind alle Elemente, die mit put in den Buffer geschrieben, aber noch nicht mit get ausgelesen wurden). Lese- und Schreib-Index dürfen dabei nicht verändert werden! Das h file habe ich vorbereitet: Meine Ideen: #ifndef CRINGBUFFER_H_ #define CRINGBUFFER_H_ class CRingBuffer { private: int m_nSize; int m_cntFilled; //j int* m_pBuffer; int m_idxWrite; int m_idxRead; public: CRingBuffer(int nSize=10); ~CRingBuffer(); bool put(int nData); bool get(int& nData); void print(); void clear(); }; #endif /* CRINGBUFFER_H_ */ Die Aufgabe 2) habe ich so gemacht: #include "CRingBuffer.h" CRingBuffer::CRingBuffer() { // TODO Auto-generated constructor stub } CRingBuffer::~CRingBuffer() { // TODO Auto-generated destructor stub } if( m_nsize == 10){ cout << 'Puffer voll' << endl; } if(m_nsize == 0 ) { cout << 'leer ' << endl; } Wie gehe ich hier bei der methode print weiter vor? void print(){ int m_nSize; int m_cntFilled = x; //j int* m_pBuffer = 0; int m_idxWrite = 0; int m_idxRead = 0; } |
|||||
|
||||||
19.11.2013, 16:43 | Auf diesen Beitrag antworten » | |||||
eulerscheZahl | RE: Objekt Programmierung Der Teil steht im Nirgendwo:
das muss in eine Funktion rein. Außerdem ist C++ case-sensitive, das heißt er macht einen Unterschied, ob du m_nSize oder m_nsize schreibst.
Zu welcher Klasse gehört die Funktion denn? CRingBuffer::print() Wenn du die Variablen hier neu anlegst, "verdeckst" du damit die Klassenvariablen, dabei müsstest du nur darauf zugreifen. Zu Aufgabe 2: es muss sowohl für voll, als auch für leer gelten: m_idxWrite == m_idxRead Ich vermute, dass m_nSize angibt, wie viel Speicherplatz zur Verfügung steht und m_cntFilled angibt, wie viele beschieben sind, richtig? dann: leer für m_cntFilled == 0, voll für m_cntFilled == m_nSize. |
|||||
19.11.2013, 17:10 | Auf diesen Beitrag antworten » | |||||
Man23 | Ja deine Vermutung ist richtig Euler. Das Problem ist das ich nicht weiß welcher Code wo stehe soll , daher auch meine Frage . Hast du paar Gips wie ich weiter vorgehen soll ? |
|||||
19.11.2013, 17:59 | Auf diesen Beitrag antworten » | |||||
eulerscheZahl | Das ist nicht das ganze Programm, aber get und put habe ich dir programmiert. |
|||||
Anzeige | ||||||
|
||||||
19.11.2013, 19:54 | Auf diesen Beitrag antworten » | |||||
Man23 | Die Methode print soll nur die Elemente ausgeben, die tatsächlich im Ringpuffer gespeichert sind. Schreiben Sie den Code für die Schleife auf, die auf alle gespeicherten Elemente zugreift und diese mit cout ausgibt (die gespeicherten Elemente sind alle Elemente, die mit put in den Buffer geschrieben, aber noch nicht mit get ausgelesen wurden). Lese- und Schreib-Index dürfen dabei nicht verändert werden! Ist diese Aufgabenstellung nicht komplett programmiert ? Was fehlt da noch? Waren meine ideen komplett falsch? |
|||||
19.11.2013, 21:12 | Auf diesen Beitrag antworten » | |||||
eulerscheZahl | In der Aufgabenstellung heißt es, dass print mittels cout den Inhalt des RingBuffers ausgeben soll, davon bist du weit entfernt. Du brauchst eine Schleife, in der cout verwendet wird. Auf m_idxRead und m_idxWrite darfst du dabei nur lesend zugreifen. |
|||||
19.11.2013, 22:03 | Auf diesen Beitrag antworten » | |||||
Man23 | Auf m_idxRead und m_idxWrite darfst du dabei nur lesend zugreifen. Wie soll ich das genau machen ? Kannst du mir das sagen? Muss heute fertig werden. |
|||||
20.11.2013, 05:42 | Auf diesen Beitrag antworten » | |||||
eulerscheZahl | Das "heute" hat ja nicht mehr geklappt.
Du darfst den Wert von m_idxRead zwar abfragen, der Variable aber keinen neuen Wert zuweisen. |
|||||
20.11.2013, 09:17 | Auf diesen Beitrag antworten » | |||||
Man23 | Ich bin jetzt leider im Moment ein wenig verwirrt . Ist das jetzt die ganze Aufgabe? |
|||||
20.11.2013, 16:06 | Auf diesen Beitrag antworten » | |||||
eulerscheZahl | Ja, das war Aufgabe 3. Es gibt noch eine Funktion clear, aber die ist bei mir noch kürzer als print. |
|||||
21.11.2013, 11:03 | Auf diesen Beitrag antworten » | |||||
Man23 | Danke Eule |
|
Verwandte Themen
Die Beliebtesten » |
|
Die Größten » |
|
Die Neuesten » |
|