for-Schleife C++ von 0 - 255

Gast #4368602
Hallo,

ich habe ein Problem mit einer Schleife. Ich möchte gerne Werte von 0 - 
255 durcharbeiten. Dabei ist der Schleifen index ein unsigned int8
1
  for(uint8_t i = 0; i < 255; i++)
2
  {
3
  }

Jedoch komme ich nicht auf den Wert von 255. Wenn ich i < 256 mach, bin 
ich in einer Endlosschleife. Gleiches gilt für i <= 255
Gast
Sepp schrieb:
> i < 255
Für i kleiner 255, kannst du auch nie auf 255 kommen

Sepp schrieb:
> Dabei ist der Schleifen index ein unsigned int8
Und warum nicht ein 16Bit index?


Vielleicht ist die For Schleife gar nichts für dich...


Tipp:
Wenn man einen Fehler im Konzept hat, dann sollte man das Konzept 
überarbeiten..
Gast
Sepp schrieb:
> Hallo,
>
> ich habe ein Problem mit einer Schleife. Ich möchte gerne Werte von 0 -
> 255 durcharbeiten. Dabei ist der Schleifen index ein unsigned int8
>
>
1
>   for(uint8_t i = 0; i < 255; i++)
2
>   {
3
>   }
4
>
>
> Jedoch komme ich nicht auf den Wert von 255. Wenn ich i < 256 mach, bin
> ich in einer Endlosschleife. Gleiches gilt für i <= 255


Wenn's denn wirklich sein muß:
1
for(bool whatever = true, uint8_t i = 0; i != 0 || whatever; i++)
2
{
3
    whatever = false;
4
}
Gast
Markus,
1
"Wenn's denn wirklich sein muß"
Was war denn an diesem Satz so unverständlich?

Eine andere Schleifenform ist selbstverständlich sinnvoller und wurde ja 
auch bereits vorher schon erwähnt.

Muss man im Internetz eigentlich mittlerweile alle offensichtlich nicht 
so ernst zu nehmenden Beiträge mit Tonnen von emojis garnieren damit es 
auch der Letzte versteht?
Sepp schrieb:
> Hallo,
>
> ich habe ein Problem mit einer Schleife. Ich möchte gerne Werte von 0 -
> 255 durcharbeiten. Dabei ist der Schleifen index ein unsigned int8
>   for(uint8_t i = 0; i < 255; i++)
>   {
>   }
>
> Jedoch komme ich nicht auf den Wert von 255.

Naja, du sagst ja, daß die Schleife nur so lange laufen soll, wie i 
kleiner als 255 ist. Somit erreichst du die 255 natürlich nicht.

> Wenn ich i < 256 mach, bin ich in einer Endlosschleife. Gleiches gilt für i
> <= 255

Was ja auch logisch ist, da ein vorzeichenloser 8-Bit-Integer immer 
kleiner als 256 und dementsprechend natürlich auch kleiner oder gleich 
255 ist. Werte, die deine Schleife beenden würden, kann er also gar 
nicht annehmen, daher läuft die Schleife für immer.

Das Problem ist, daß die Schleifenbedingung bei der for-Schleife vor der 
Ausführung des Schleifeninhalts geprüft wird. Das führt dazu, daß die 0 
zweimal geprüft wird, nämlich einmal beim ersten Durchaluf, wo die 
Schleife  weiterlaufen soll und einmal beim letzten, wo sie aber 
abbrechen soll.
Es gibt zwei mögliche Lösungsansätze:

1. Die zusätzliche Informationen zur Unterscheidung zwischen erstem und 
letztem Durchlauf irgendwo unterbringen. Das geht z.B. durch Erweiterung 
des Schleifenzählers auf 16 Bit, so daß er nach 255 nicht überläuft. 
Eine andere - wenn auch sehr eigenwillige - Möglichkeit ist die von 
Norbert.

2. Die Prüfung des Schleifenzählers auf das Ende der Schleife verlagern. 
Das geht mit einer for-Schleife aber nicht sinnvoll. Daher die Lösung 
von Markus F mit der while-Schleife.
Norbert schrieb:
> Muss man im Internetz eigentlich mittlerweile alle offensichtlich nicht
> so ernst zu nehmenden Beiträge mit Tonnen von emojis garnieren damit es
> auch der Letzte versteht?

Muss man. Seit ca. 1/2 Jahr muß man das, weil Humor im Allgemeinen ganz 
schlecht ankommt und bei Vielen das Gesicht zur Faust geballt ist.

MfG Paul
Norbert schrieb:
> Muss man im Internetz eigentlich mittlerweile alle offensichtlich nicht
> so ernst zu nehmenden Beiträge mit Tonnen von emojis garnieren damit es
> auch der Letzte versteht?

Hast du denn auch schon mal darüber nachgedacht, dass das für jemanden, 
der gerade lernt, wie Schleifen funktionieren, nicht ganz so 
offensichtlich sein könnte?

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 10 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.