Hallo.
Hab gerade einige Zeit mit einer FOR-Schleife gekämpft.
( Eigentlich eher mit der Wirkung, weil der Fehler einen
ganz komischen Effekt - wie immer - ganz wo anders hatte :-( )
Hab folgenden Code:
for (tmp = 0; tmp < 100; tmp++) {
mPrgSpeed[tmp] = eeprom_read_byte(&eSpeed[tmp]);
mPrgLeft[tmp] = eeprom_read_dword(&eLeft[tmp]);
mPrgRight[tmp] = eeprom_read_dword(&eRight[tmp]);
}
Bei eRight[0] steht 100 im EEProm. Wird auch so eingelesen, wenn
ich debugge. (mPrgRight[0] = 100) Sobald ich aber die Schleife verlasse
ist mPrgRight[0] = 0.
Kann mir jemand sagen was da falsch läuft ?
Vor allem die gleiche Schleife als WHILE() läuft.
Vielen Dank,
Pepe.
Pepe schrieb: > ganz komischen Effekt - wie immer - ganz wo anders hatte :-( ) Ist hier vmtl. auch so, d.h. es bringts nicht, den korrekten Code zu zeigen und den falschen wegzulassen.
Die FOR-Schleife ist aber der "fehlerhafte" Code. Ich setzen einen Breakpoint direkt dahinter und mPrgRight[0] enthält. Pepe.
OK, sorry. Hier nochmal in lesbarer Form: Die FOR-Schleife ist aber der "fehlerhafte" Code. Ich setze einen Breakpoint direkt dahinter und mPrgRight[0] enthält eine 0. Pepe.
Pepe schrieb: > Die FOR-Schleife ist aber der "fehlerhafte" Code. Dann zeige zumindest alles, was für diese For-Schleife relevant ist. Wo sind die ganzen Deklarationen/Definitionen der beteiligten Variablen?
Schön für dich, aber für mich nicht nachvollziehbar, weil mich der Compiler bei dem Codehäppchen nur auslacht.
Wenn du weißt, wo der Fehler ist, ist ja alles in Ordnung :-) Ich würde auch eher auf etwas daneben tippen, aber du hast sicher recht...
Hier mehr Code...
uint8_t mPrgSpeed[99];
int32_t mPrgLeft[99];
int32_t mPrgRight[99];
uint8_t eSpeed[99] EEMEM = {30, 30, ... }
int32_t eLeft[99] EEMEM = {-100, -125, ... }
int32_t eRight[99] EEMEM = {100, 125, ... }
void fVarSetup(void) {
uint8_t tmp;
for (tmp = 0; tmp < 100; tmp++) {
mPrgSpeed[tmp] = (uint8_t) eeprom_read_byte(&eSpeed[tmp]);
mPrgLeft[tmp] = (int32_t) eeprom_read_dword(&eLeft[tmp]);
mPrgRight[tmp] = (int32_t) eeprom_read_dword(&eRight[tmp]);
}
if ((mActualPrg < 1) || (mActualPrg > 99)) !Hier kommt der Breakpoint
!
...
}
1 | uint8_t mPrgSpeed[99]; |
2 | int32_t mPrgLeft[99]; |
3 | int32_t mPrgRight[99]; |
Da haben wir doch schon dein Problem. Du schreibst 100 Werte in Arrays der Größe 99.
@ Klaus Wachtler: Hab zwar ne Lösung. Aber ich möchte gerade mal nicht wissen wieviele FOR-Schleifen ich in meinem Leben schon geschrieben hab. Macht mich ziemlich "nervös", wenn ich zu doof für ne FOR-Schleife geworden bin...
Upps. Ok. Ich mach jetzt Wochenende. Ich schreib jetzt mal nicht wie lang ich gesucht habe. Gelegentlich sieht mal den Wald vor lauter Bäumen nicht. Vielen Dank für die schnelle Hilfe.
sternst hatte Recht. Ich sollte nicht bis 100 zählen, wenn's nur 99 Einträge gibt.
Aus den Namen der Funktionen könnte man schlußfolgern, daß es sich möglicherweise um einen AVR handelt. Wieviel Platz hast du denn überhaupt in deinem EEPROM und dem RAM? Immerhin brauchen deine Arrays zusammen für jeden der beiden Speicher 891 Bytes.
Bei statischen Vektoren kann man das elegant so lösen:
1 | #define N_VECT(v) ( sizeof(v) / sizeof (*(v)) )
|
2 | int vector[100] = { ... } |
3 | for (int i = 0; i < N_VECT(vector); i++) .. |
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.