www.mikrocontroller.net

Forum: GCC Bug bei FOR-Schleife ?


Important announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
Autor: Pepe (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht 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.

Autor: A. K. (prx)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht 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.

Autor: Pepe (Gast)
Datum:

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

Autor: Pepe (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht 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.

Autor: Stefan Ernst (sternst)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht 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?

Autor: A. K. (prx)
Datum:

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

Autor: Klaus Wachtler (mfgkw)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht 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...

Autor: Pepe (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht 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 
!
  ...

}

Autor: Stefan Ernst (sternst)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
uint8_t  mPrgSpeed[99];
int32_t  mPrgLeft[99];
int32_t  mPrgRight[99];
Da haben wir doch schon dein Problem. Du schreibst 100 Werte in Arrays 
der Größe 99.

Autor: Pepe (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht 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...

Autor: Pepe (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht 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.

Beitrag #2664325 wurde vom Autor gelöscht.
Autor: Pepe (Gast)
Datum:

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

Beitrag #2664403 wurde von einem Moderator gelöscht.
Autor: Rolf Magnus (rmagnus)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht 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.

Autor: Sven P. (haku) Benutzerseite
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Bei statischen Vektoren kann man das elegant so lösen:
#define N_VECT(v)     ( sizeof(v) / sizeof (*(v)) )
int vector[100] = { ... }
for (int i = 0; i < N_VECT(vector); i++) ..

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel




Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder GIF-Format hochladen.
Siehe Bildformate
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken erkennst du die Nutzungsbedingungen an.

webmaster@mikrocontroller.netImpressumNutzungsbedingungenWerbung auf Mikrocontroller.net