for-Schleife C++ von 0 - 255

Gast #4368602
Lesenswert?
• ▲
▼
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 #4368613
Lesenswert?
• ▲
▼
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 #4368637
Lesenswert?
• ▲
▼
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?
#4368642
Lesenswert?
• ▲
▼
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.
#4368647
Lesenswert?
• ▲
▼
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

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.

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.