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.
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.
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.
Wenn du
1 | index = ++index % MAX_VALS; |
gehen auch beliebige Werte für MAX_VALS.
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.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.