Ich möchte gerne noch zwei Funktionalitäten dazu haben - Fifo leeren und
Anzahl Elemente im Fifo ausrechnen.
Dazu habe ich mir folgendes ausgedacht:
1
voidBufferClear()
2
{
3
buffer.read=buffer.write=0;
4
}
5
6
uint8_tBufferAnzahl()
7
{
8
int16_thilf;
9
hilf=buffer.write-buffer.read;
10
11
// keine Werte vorhanden:
12
if(hilf=0){
13
return(0);
14
}
15
16
// hilf > 0
17
if(hilf>0){
18
return(hilf);
19
}
20
21
if(hilf<0){
22
return(BUFFER_SIZE-hilf);
23
}
24
}
Bei der clear-Funktion braucht man glaub ich nicht weiter diskutieren -
so ist sie auf alle Fälle leer. Aber bei der Ermittlung der Anzahl der
Elemente in dem Fifo bin ich mir unsicher. Ist die Lösung so brauchbar
mit den drei if-Abfragen - oder gibt es eine einfachere Variante? Ich
habe die Hilfsvariable extra als int-Variable genommen, die doppelt so
groß ist, wie die uint8_t-Variable, damit beim Subtrahieren auch ein
negativer Wert funktioniert. Meint ihr, das das so funktioniert, was ich
mir ausgedacht hab?
Das sieht schon mal brauchbar aus. Aber die Kommentare wie // hilf > 0
sind total überflüssig.
Nach jedem return fehlt noch ein break, damit die Funktion vorzeitig
beendet wird.
BUFFER_SIZE muss eine Zweierpotenz mit ganzzahlige Exponenten sein.
gonso schrieb:> Nach jedem return fehlt noch ein break, damit die Funktion vorzeitig> beendet wird.
Die Funktion wird durch das return beendet.
Anfänger schrieb:> if (hilf<0) {> return (BUFFER_SIZE-hilf);> }
Das get auch schief: Wenn hilf negativ ist, dann ist BUFFER_SIZE-hilf
größer als BUFFER_SIZE, z.B. 128 - -6 = 134.
BTW: return ist keine Funktion, die Klammen sind also nicht notwendig.
Max H. schrieb:> Das get auch schief: Wenn hilf negativ ist, dann ist BUFFER_SIZE-hilf> größer als BUFFER_SIZE, z.B. 128 - -6 = 134.
uupps :-), naja, darum bin ich ja noch ein Anfänger und kein
Fortgeschrittener bzw. Profi, so wie Du. Mir wäre das wahrscheinlich nie
aufgefallen und ich hätte mich gewundert, warum ich Blödsinn rausbekomme
:-)
Guten Morgen!
Aus dem Quellcode würde ich gerne noch die letzte Zeile hier aus dem
Abschnitt verstehen:
1
structBuffer{
2
uint8_tdata[BUFFER_SIZE];
3
uint8_tread;// zeigt auf das Feld mit dem ältesten Inhalt
4
uint8_twrite;// zeigt immer auf leeres Feld
5
}buffer={{},0,0};
buffer = {{}, 0, 0}
Ich bin mir über die Verwendung der geschweiften Klammern noch im
Unklaren. Die beiden Nullen dort sind sicherlich als Initialwerte für
read und write zu verstehen. Mit {} - ist damit gemeint, dass das Array
data[BUFFER_SIZE] leer sein soll?
Warum kann ich dort überhaupt geschweifte Klammern benutzen? Sorry, wenn
meine Frage vielleicht trivial ist - aber ich habe in meinem
C-Anfängerbuch nachgeschaut und noch nicht herausgefunden, warum man
sagen kann buffer={...}. Ich hab bisher immer gedacht, dass die
geschweiften Klammern dazu da sind, Funktionsblöcke einzugrenzen.
Anfänger schrieb:> Mit {} - ist damit gemeint, dass das Array> data[BUFFER_SIZE] leer sein soll?
Es wird mit 0 initialisiert.
> warum man sagen kann buffer={...}.
Das ist laut C-Standard einfach so.
> Ich hab bisher immer gedacht, dass die geschweiften Klammern> dazu da sind, Funktionsblöcke einzugrenzen.
Wie du gesehen hast nicht ausschließlich.
cool, danke für Eure Hilfe.
Ich hab jetzt mal versucht, das C-Programm in eine Klassenstruktur
umzuwandeln (Headerdatei und cpp-Datei sind jetzt hier in dem
Codeschnippsel zusammen):
Max H. schrieb:> Nein, die Präprozessor Anweisungen funktionieren nur mit Konstanten.> Dann müsstest du 'size' mit einem #define machen
ok, danke. Ich brauche in meinem Programm zwei Buffers mit
unterschiedlichen Größen und wollte gerne die Größe variabel erzeugen
können - auch für später mal, wenn ich wieder mal nen Buffer brauche.
Aber das hier würde gehen?