Hallo!
Ich brauche mal wieder etwas Hilfe, und zwar möchte ich 24 Speicherstellen (Variablen!?) deklarieren, die wie eine Art Schieberegister funktionieren: alle 10ms kommt ein neuer wert, der den vorigen wert eine stelle weiter schieben soll: der erste wert geht also in die erste speicherstelle, der zweite, nach 10ms, schiebt den ersten in die zweite speicherstelle und geht selbst in die erste, der dritte wert, nach weiteren 10ms, schiebt wieder alle eine stelle weiter hoch. nach 24 stellen fällt der erste wert am ende heraus und nach 10ms der zweite,.... dann möchte ich alle 10ms, nachdem jeweils ein neuer wert eingeschoben wurde, die aktuelle summe aller werte in den 24 speicherstellen für eine rechnung benutzen. die werte in den einzelnen speicherstellen sind immer ganze zahlen (eine anzahl von gemmessenen impulsen innerhalb der 10ms)
Hat da jemand ne idee, wie ich das programmieren kann?
Grüße christian
Hallo,
Suche mal nach "Ringpuffer".
Man legt sich ein Array an, und einen Zeiger für die aktuelle Position.
Wenn ein neuer Wert dazu kommt, wird der Zeiger eine Position weitergezählt, am Ende fängt man wieder von Vorne an.
Für das auslesen legt man sich einen 2. Zeiger an, der auf den ältesten Wert zeigt. Dieser muss dann auch mitwandern, falls der Puffer "voll" ist, also die ersten Werte wieder überschrieben werden.
Hallo Christian!Zitat von drivepro82
Eine Möglichkeit: http://paste.pocoo.org/show/87101/
mfg
Gerold
:-)
@Linux_80: Wofür brauchst du denn den zweiten Zeiger, der erste Zeiger steht doch genau auf der Position, die als nächstes überschrieben werden soll?Zitat von linux_80
@drivepro82: Für die Summe würde ich es nicht so machen, wie in dem Link von Gerold. Dort werden zum Ausdruck jedesmal alle 24 Werte addiert. Das kann man auch einfacher haben.
Halte dir die Summe immer in einer Variable vor. Bevor du den neuen Wert ins Array ablegst, ziehst du erst den alten Wert an dieser Stelle von der Summe ab. Dann addierst du den neuen hinzu und überschreibst den alten Wert ins Array. Also etwa so:
Dim Pointer as Byte
Dim My_sum as Word 'falls nötig auch Long
Dim My_array(24) as byte 'falls nötig Word
Incr Pointer
My_sum = My_sum - My_array(Pointer)
My_sum = My_sum + Neuer_wert
My_array(Pointer) = Neuer_wert
Gruß
Rolf
Lesezeichen