Forum: Compiler & IDEs Bug bei FOR-Schleife ?


von Pepe (Gast)


Lesenswert?

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.

von (prx) A. K. (prx)


Lesenswert?

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.

von Pepe (Gast)


Lesenswert?

Die FOR-Schleife ist aber der "fehlerhafte" Code.
Ich setzen einen Breakpoint direkt dahinter und mPrgRight[0] enthält.
Pepe.

von Pepe (Gast)


Lesenswert?

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.

von Stefan E. (sternst)


Lesenswert?

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?

von (prx) A. K. (prx)


Lesenswert?

Schön für dich, aber für mich nicht nachvollziehbar, weil mich der 
Compiler bei dem Codehäppchen nur auslacht.

von Klaus W. (mfgkw)


Lesenswert?

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...

von Pepe (Gast)


Lesenswert?

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 
!
  ...

}

von Stefan E. (sternst)


Lesenswert?

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.

von Pepe (Gast)


Lesenswert?

@ 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...

von Pepe (Gast)


Lesenswert?

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.

von Pepe (Gast)


Lesenswert?

sternst hatte Recht.
Ich sollte nicht bis 100 zählen, wenn's nur 99 Einträge gibt.

von Rolf M. (rmagnus)


Lesenswert?

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.

von Sven P. (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.