Hallo zusammen, ich habe ein Problem bei einer Mittelwertbildung aus einem Array. Ich habe ein Array aus einer eigenend Struct wodurch die einzelnen Punkte eine Stromwert, Messpunktnummer und Zeitwert haben. Dieses Array wird im normal Fall vom ADC beschrieben, das klappt auch. Zum testsen von einzelnen Funktionen habe ich das Array manuell selbst beschrieben. Nun möchte ich aus 5 Werten den Mittelwert für Strom und Zeit berechnen. Beispiel Strom: Arraystelle: Stromwert[mA]: 0 1000 1 1200 2 1100 3 1200 4 1300 Theoredischer Mittelwert: 1160 Am Ende Prüfe ich meine Mittelwertfunktion mit einem einfachen if auf 1160 und dann soll eine LED an gehen. Jedoch bleibt die LED aus. Sie geht an wenn ich auf 960 vergleiche. Das Ergebnis entsteht wenn man nur die Array Werte 1-4 und nicht 0-4 zur Mittelwertbildung benutzt werden. aber warum benutzt mein Code nicht 0-4? Meine for schleife geht von 0-4 von daher versteh ichs nicht. Oder leigt der fehler noch wo anders? Gruß und Danke schonmal für die hilfe
Hi! So wie es aussieht, werden nur die Wert von 1-4 addiert und durch 5 geteilt, der Wert bei 0 scheint zu fehlen. Gruss, Micha Edit: Hast Du gerade Deinen Text editiert?
> #define SIZE_POINTS 4 > static volatile ADC_MP Points [SIZE_POINTS]; Points ist zu klein!
Es gibt Fragestellung, für die haben andere Leute Debugger erfunden.
Deine ist so eine.
Schrittweise durchsteppen, Werte ansehen, und überprüfen, was passiert.
Falls du keinen Debugger hast, der Fehler steckt in dieser Zeile:
>#define SIZE_POINTS 4
Oliver
Du schrebist den Mittelwert in "The_Point.current". The_Point.current = (summe_current /5); Die fragst aber "summe_current" ab. Dort steht noch die Summe, nicht der Mittelwert. if (summe_current == 1160)
Und wenn in einer for-Schleife, die ganz offensichtlich die Aufgabe hat, alle Elemente eines Arrays durchzugehen ... for (uint8_t i = 0; i<=4; i++) ein <= bei der Abbruchbedingung auftaucht, dann muessen in dir in Zukunft sofort 5 Warnglocken und Sirenen losgehen. Etwas in der Form sieht praktisch immer so aus
1 | #define ANZAHL 5
|
2 | |
3 | int Array[ ANZAHL ]; |
4 | |
5 | |
6 | ...
|
7 | |
8 | for( i = 0; i < ANZAHL; ++i ) |
9 | mach was mit Array[i]; |
achte darauf, wie das #define-ment für Anzahl an den einzelnen Stellen benutzt wird! Auf die Art stimmt immer alles zusammen. Und nochwas: Ein Array mit 5 Einträgen, hat gültige Indizes 0, 1, 2, 3, 4 zähl nach. Sind genau 5 Stück. Bei der Definition eines Arrays gibt man an, wieviele Elemente man haben möchte und nicht, welches der höchste noch zulässige Index sein soll.
Michael V. schrieb: > Edit: Hast Du gerade Deinen Text editiert? nein. kann man als Gast auch nicht oder? Oliver schrieb: > Falls du keinen Debugger hast eben hab leider keinen... da hab ich mit der 0 Indizierung bei Arrays vertan. Hab in der Verwirrung angenommen das wenn ich 4 angebe zählt das Array 0,1,2,3,4. Sind aber 5 Werte ;) Danke!
NurEinGast schrieb: > Die fragst aber "summe_current" ab. Dort steht noch die Summe, nicht der > > Mittelwert. > > if (summe_current == 1160) ja weiß ich. sollte The_Point.current hab ich vergessen zu ändern vorm hochladen weil ich da kurzeitig auf 4800 abgefragt hatte.
Karl heinz Buchegger schrieb: > #define ANZAHL 5 > int Array[ ANZAHL ]; > ... > > > > for( i = 0; i < ANZAHL; ++i ) > > mach was mit Array[i]; ja sollte lieber Anzahl angeben das stimmt. aber warum nur < und nicht <= ? mit < fehlt mir doch mein letzter wert oder?
Andi schrieb: > Karl heinz Buchegger schrieb: >> #define ANZAHL 5 >> int Array[ ANZAHL ]; > >> ... >> >> >> >> for( i = 0; i < ANZAHL; ++i ) >> >> mach was mit Array[i]; > > > ja sollte lieber Anzahl angeben das stimmt. aber warum nur < und nicht > <= ? > mit < fehlt mir doch mein letzter wert oder? Anzahl sei 5 0 ist kleiner als 5 1 ist kleiner als 5 2 ist kleiner als 5 3 ist kleiner als 5 4 ist kleiner als 5 5 ist nicht kleiner als 5 -> Schleife wird nicht mehr wiederholt sondern verlassen. Der Schleifenrumpf wird als mit Werten für i von 0, 1, 2, 3, 4 durchlaufen. Sobald i zu 5 wird, schlägt die Bedingung zu und die Schleife ist beendet. Was waren noch mal die gültigen Indizes bei einem Array der Größe 5? 0, 1, 2, 3, 4 (zähl nach, sind genau 5 Stück)
ja logisch. Ich sollte mirn Kaffee holen um wieder denken zu können ;) Aber danke das du immer so geduldige und gute Antworten gibt. Hast mir die letzten Wochen schon oft geholfen!
Tipp: spare Dir die Division durch 5 und vergleiche mit dem 5-fachen des Grenzwertes (5*1160=5800). PS: denk auch dran, den Wertebereich für 16-bit-Zahlen nicht zu überschreiten!
Andi schrieb: > Oliver schrieb: >> Falls du keinen Debugger hast > > eben hab leider keinen... Das solltest du schleunigst ändern. Exhte Männer programmieren zwar ohne, aber diese Sorte echte Männer gibts auch nur im Film. Oliver
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.