Registrierung Kalender Mitgliederliste Teammitglieder Suche Häufig gestellte Fragen Zur Startseite

Informatiker Board » Themengebiete » Praktische Informatik » Objekt Programmierung » Hallo Gast [Anmelden|Registrieren]
Letzter Beitrag | Erster ungelesener Beitrag Druckvorschau | An Freund senden | Thema zu Favoriten hinzufügen
Neues Thema erstellen Antwort erstellen
Zum Ende der Seite springen Objekt Programmierung
Autor
Beitrag « Vorheriges Thema | Nächstes Thema »
Man23
unregistriert
Objekt Programmierung Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

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;
}
18.11.2013 23:08
eulerscheZahl eulerscheZahl ist männlich
Foren Gott


Dabei seit: 04.01.2013
Beiträge: 2.859

RE: Objekt Programmierung Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

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.

__________________
Syntax Highlighting fürs Board (Link)
19.11.2013 16:43 eulerscheZahl ist offline Beiträge von eulerscheZahl suchen Nehmen Sie eulerscheZahl in Ihre Freundesliste auf
Man23
unregistriert
Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

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:10
eulerscheZahl eulerscheZahl ist männlich
Foren Gott


Dabei seit: 04.01.2013
Beiträge: 2.859

Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

Das ist nicht das ganze Programm, aber get und put habe ich dir programmiert.

Dateianhang:
zip CRingBuffer.zip (1,25 KB, 469 mal heruntergeladen)


__________________
Syntax Highlighting fürs Board (Link)
19.11.2013 17:59 eulerscheZahl ist offline Beiträge von eulerscheZahl suchen Nehmen Sie eulerscheZahl in Ihre Freundesliste auf
Man23
unregistriert
Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

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 19:54
eulerscheZahl eulerscheZahl ist männlich
Foren Gott


Dabei seit: 04.01.2013
Beiträge: 2.859

Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

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.

__________________
Syntax Highlighting fürs Board (Link)
19.11.2013 21:12 eulerscheZahl ist offline Beiträge von eulerscheZahl suchen Nehmen Sie eulerscheZahl in Ihre Freundesliste auf
Man23
unregistriert
Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

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.
19.11.2013 22:03
eulerscheZahl eulerscheZahl ist männlich
Foren Gott


Dabei seit: 04.01.2013
Beiträge: 2.859

Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

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.

__________________
Syntax Highlighting fürs Board (Link)
20.11.2013 05:42 eulerscheZahl ist offline Beiträge von eulerscheZahl suchen Nehmen Sie eulerscheZahl in Ihre Freundesliste auf
Man23
unregistriert
Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

Ich bin jetzt leider im Moment ein wenig verwirrt .

Ist das jetzt die ganze Aufgabe?
20.11.2013 09:17
eulerscheZahl eulerscheZahl ist männlich
Foren Gott


Dabei seit: 04.01.2013
Beiträge: 2.859

Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

Ja, das war Aufgabe 3.

Es gibt noch eine Funktion clear, aber die ist bei mir noch kürzer als print.

__________________
Syntax Highlighting fürs Board (Link)
20.11.2013 16:06 eulerscheZahl ist offline Beiträge von eulerscheZahl suchen Nehmen Sie eulerscheZahl in Ihre Freundesliste auf
Man23
unregistriert
Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

Danke Eule
21.11.2013 11:03
Baumstruktur | Brettstruktur
Gehe zu:
Neues Thema erstellen Antwort erstellen
Informatiker Board » Themengebiete » Praktische Informatik » Objekt Programmierung