mikrocontroller.net

Forum: Compiler & IDEs for-Schleife und dekrementieren


Autor: Herb (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wer hilft mir, bei der Demontage meines Brett vorm Kopf?

geht nicht:
uint8_t i;
for (i = 255; i>=0; i--)
{
  // irgendwas
}

geht:
long i;
for (i = 255; i>=0; i--)
{
  // irgendwas
}

Autor: Walter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
die Bedingnung in der for schleife ist einfach immer true,
oder was geht nicht?

Walter

Autor: Simon K. (simon) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das liegt daran, dass "long" ein signed Datentyp ist. Und da deine 
For-Schleife solange läuft, wie die Iterationsvariable größer oder 
gleich 0 ist (Also die Schleife nur abbricht, wenn die Variable auf -1 
dekrementiert wird), funktioniert das nicht mit einem unsigned-Typ (wie 
der uint8_t).

Das "Sign" ist in diesem Fall das Vorzeichen. Ein unsigned-Typ hat also 
kein Vorzeichen.

Autor: Ekschperde (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
uint8_t i; wär ja wohl ein unsigned char, wertebereich: 0 ... 255.

Der kann nicht kleiner als 0 werden ;-)

Ein long schon, weil signed.

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die Begründung hast du ja schon.

Ersetze die erste Schrleife z.B. durch

uint8_t i;
i = 255;
do
{
  // irgendwas
} while(i--);

Frohes Fest!

Autor: Herb (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Oh mann!
Danke für die Hilfe. War ein dickes Brett. Habe klar übersehen, daß vor 
dem Vergleich dekrementiert wird und dann ja -1 raus kommt.
:-\

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nee, nicht richtig. -1 kann nie rauskommen, weil i im ersten Beispiel 
ein unsigned Datentyp ist, d.h. ohne Vorzeichen, d.h. immer positiv oder 
gleich null. Du hättest wenn i gleich 0 ist in der nächsten Schleife 
beim Dekrementieren einen Überlauf und i wäre 255 (wegen 8-Bit in 
uint8_t). Du hast dann mit der ersten for-Schleife eine unsaubere 
Endlosschleife produziert.

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
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
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 bestätigst du, die Nutzungsbedingungen anzuerkennen.