Werte in Arrays schieben!

OP #2301344
Lesenswert?

Hallo!

Ich arbeite in c, uVision von Keil!

Ich möchte einen Mittelwert Bilden. Benütze ein Array mit Indexwert 8!

Meine Idee, erster gemessener Wert 5 in Array[0] speichern, dann aus dem 
Array den Mittelwert bilden.

5 + 0 + 0 + 0 + 0 + 0 + 0 + 0 / 0 = 0.625

Den Wert von Array[0] ins Array[1] schieben, 2. Messwert 7 in Array[0] 
speichern.

7 + 5 + 0 + 0 + 0 + 0 + 0 + 0 / 0 = 1.5      usw.


Wie kann ich den Wert des Array[0] in Array[1] usw schieben / laden??

Array[0] <<= 1; Schiftet ja den Wert selbst!

Danke und Gruss!

M.B.
#2301349
Lesenswert?

M. B. schrieb:

> Wie kann ich den Wert des Array[0] in Array[1] usw schieben / laden??

Ist das eine Fangfrage?

     Array[1] = Array[0];


Aber wozu schieben. schreib doch einfach den nächsten Messwert nach 
Array[1]. Und den danach gemessenen nach Array[2], etc. etc. Du musst 
dir nur merken, wo der nächste Messwert hin muss. Und wenn du am Ende 
des Arrays angelangt bist, dann fängst du wieder beim Index 0 an.
Persönliche Seite #2301360
Lesenswert?

Auf die schnelle:
1
#define MAX_VALS          0x10     // Muss 2^n sein !
2

3
unsigned int values[MAX_VALS] = { 0 }; 
4

5
void AddValue(unsigned int newVal)
6
{
7
  static unsigned int index=0;
8

9
  values[index] = newVal;
10
  index = ++index & (MAX_VALS-1);
11
}
Könnte noch ein kleiner Bug drin sein, geht aber ums Prinzip :-)

Die Grösse des Arrays ist dann deine Tiefe für die Mittelwertbildung. In 
einer anderen Funktion kannst dann einfach von 0..MAX_VALS über das 
Array iterieren.


Anm.:
SHIFT geht nur über Bits hinweg, bis zur Architekturgrösse, nicht aber 
über Felder eines Arrays oder andere WORD-Gruppen.


VG,
/th.
#2301576
Lesenswert?

Und wenn man dann noch
1
   index++;
2
   if( index == MAX_VALS )
3
     index = 0;

hat man beides mit einer Klappe geschlagen. Keine Division und trotzdem 
beliebige Werte für MAX_VALS, bei meistens nur ganz leichten 
Performance-Verlusten gegenüber der & Lösung, die im Regelfall völlig 
irrelevant sind.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren