Forum: Mikrocontroller und Digitale Elektronik for-Schleife C++ von 0 - 255


von Sepp (Gast)


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

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Sepp schrieb:
> Jedoch komme ich nicht auf den Wert von 255.
Doch. Aber dann springst du raus.

Wenn unbedingt ein uint8_t sein muss, dann probiers doch mit einer 
do()-while-Schleife...

: Bearbeitet durch Moderator
von Ulrich F. (Gast)


Lesenswert?

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

von Norbert (Gast)


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
}

von Markus F. (mfro)


Lesenswert?

Norbert schrieb:
> Wenn's denn wirklich sein muß:
>
1
> for(bool whatever = true, uint8_t i = 0; i != 0 || whatever; i++)
2
> {
3
>     whatever = false;
4
> }
5
>


Uiuiui. Die armen Spatzen...
1
i = 0;
2
do
3
{
4
  ...
5
} while (++i != 0);

: Bearbeitet durch User
von Norbert (Gast)


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?

von Rolf M. (rmagnus)


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.

von Markus F. (mfro)


Lesenswert?

Norbert schrieb:
> Markus,
>
>
1
"Wenn's denn wirklich sein muß"
> Was war denn an diesem Satz so unverständlich?

Keine Sorge, ich hab' den Satz verstanden.

von Paul B. (paul_baumann)


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?

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

von Rolf M. (rmagnus)


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?

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.