Objekt Programmierung

Neue Frage »

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;
}
 
Auf diesen Beitrag antworten »
eulerscheZahl RE: Objekt Programmierung

Der Teil steht im Nirgendwo:
Zitat:
if( m_nsize == 10){

cout << 'Puffer voll' << endl;


}

if(m_nsize == 0 ) {

cout << 'leer ' << endl;
}

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.


Zitat:
void print(){


int m_nSize;
int m_cntFilled = x;
//j
int* m_pBuffer = 0;
int m_idxWrite = 0;
int m_idxRead = 0;
}

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.
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 ?
Auf diesen Beitrag antworten »
eulerscheZahl

Das ist nicht das ganze Programm, aber get und put habe ich dir programmiert.
 
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?
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.
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.
Auf diesen Beitrag antworten »
eulerscheZahl

Das "heute" hat ja nicht mehr geklappt.
code:
1:
2:
3:
4:
5:
void CRingBuffer::print()
{
	for(int i = 0; i < m_cntFilled; i++)
		std::cout << *(m_pBuffer + ((i + m_idxRead) % m_nSize)) << std::endl;
}

Du darfst den Wert von m_idxRead zwar abfragen, der Variable aber keinen neuen Wert zuweisen.
Auf diesen Beitrag antworten »
Man23

Ich bin jetzt leider im Moment ein wenig verwirrt .

Ist das jetzt die ganze Aufgabe?
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.
Auf diesen Beitrag antworten »
Man23

Danke Eule
 
Neue Frage »
Antworten »


Verwandte Themen

Die Beliebtesten »
Die Größten »
Die Neuesten »