Hi Leute, Kurze Frage zur for Schleife in C. for ( x=0; x<256; x++) .. erzeugt ja 256, also 0..255 schleifendurchläufe. Das ganze geht aber nur, wenn ich x als uint16_t deklariere. Wie kann ich das mit einem uint8_t erreichen? Danke schonmal
x = 0; do { // irgendwas sinnvolles x++; } while (x != 0); P.S. zu langsam...
Obiges ist ja schon fast richtig, aber immer noch off-by-one! Damit sollte es klappen:
1 | uint8_t c = 0; |
2 | do{ |
3 | // please code here
|
4 | }while ( ++c != 0); |
Vielen Dank. Hätte ich auch selbst drauf kommen können.... @ Gelegenheitsposter (Gast) Das konnte ich mir gradeso noch dazureimen ;-)
versteh ich jetzt nicht... die Beispiele sind doch alle 3 korrekt, oder nicht?
SoLaLa wrote: > versteh ich jetzt nicht... die Beispiele sind doch alle 3 korrekt, oder > nicht? Nein, mathematisch exakt sind sie alle falsch. Wenn man x anfängt bei 0 zu zählen und immer nur erhöht, kann der Wert nie wieder 0 sein. Neuere Versionen von gcc erkennen das und optimieren entsprechend, falls nicht entsprechend beschaltert ist (-fno-strict-overflow). gcc release notes state: > For example, a loop like >
1 | > for (i = 1; i > 0; i *= 2) |
2 | >
|
> is presumably intended to continue looping until i overflows. > With -fstrict-overflow, the compiler may assume that signed overflow > will not occur, and transform this into an infinite loop. > -fstrict-overflow is turned on by default at -O2...
Georg johann Lay wrote: >> versteh ich jetzt nicht... die Beispiele sind doch alle 3 korrekt, oder >> nicht? > Nein, mathematisch exakt sind sie alle falsch. Es ging aber nicht um Mathematik, sondern um die Regeln der Programmiersprache C. Unser Mathe-Prof hatte mal erzählt, dass es einem seiner älteren Kollegen damals völliges Unverständnis verursacht hat, in einem FORTRAN-Programm die Zeile I = I + 1 zu sehen. Das ist nämlich mathematisch auch völliger Unsinn. (Pascal hat das besser formuliert als i := i + 1.) > Wenn man x anfängt bei 0 zu zählen und immer nur erhöht, kann der Wert > nie wieder 0 sein. Doch, nach den Regeln der Programmiersprache C schon. Der OP hat schließlich ausdrücklich von einem uint8_t geschrieben, und für den (und nur für den) ist das Verhalten völlig exakt so definiert. > Neuere Versionen von gcc erkennen das und optimieren > entsprechend, falls nicht entsprechend beschaltert ist > (-fno-strict-overflow). Das bezieht sich nur auf signed overflow, der ist nämlich implementation defined. Für unsigned integer Typen sind die Regeln eindeutig, dass der Überlauf vom jeweiligen Maximalwert nach 0 stillschweigend erfolgt.
Matthias Lipinsky wrote: > Hi Leute, > > Kurze Frage zur for Schleife in C. > > for ( x=0; x<256; x++) > .. > > erzeugt ja 256, also 0..255 schleifendurchläufe. Das ganze geht aber > nur, wenn ich x als uint16_t deklariere. Wie kann ich das mit einem > uint8_t erreichen? > > > Danke schonmal Hallo, meine Vermutung, 256 passt nicht mehr in unit8_t von daher würde ich es mit for ( x=0;x<=255;x++) versuchen. x nimmt in der ursprüngliche Schleife ja in jedem Fall den Wert 256 an. Kann natürlich sein, dass ich vollkommen falsch liege. Gruß Frank
Frank Link wrote:
> Kann natürlich sein, dass ich vollkommen falsch liege.
Du liegst vollkommen falsch.
Wenn x ein uint8_t ist, gibt es keinen Wert für x, der
die Bedingung x <= 255 nicht erfüllen würde -> du hast eine
Endlosschleife.
>Kann natürlich sein, dass ich vollkommen falsch liege. >for ( x=0;x<=255;x++) Hm.. Solche "Versuche" habe ich vor meinem Posting hier auch schon gemacht:
1 | for ( x=0;++x!=255;) |
2 | ..
|
3 | for ( x=0;x<255;++x) |
Mit einer reinen for-Schleife kann das gar nicht gehen, da diese kopfabweisend ist. Sie erlaubt nur 0 bis 255 Durchläufe. Eine fußabweisende Schleife erlaubt 1 bis 256 Durchläufe und ist deshalb auch vorgeschlagen worden. Man könnte auch eine Schleife mit 255 Durchläufen verwenden und den wiederholten Ausdruck im Anschluss an die Schleife erneut einmal ausführen - bringt aber hier keinen Nutzen. >>Nein, mathematisch exakt sind sie alle falsch. >Es ging aber nicht um Mathematik, sondern um die Regeln der >Programmiersprache C. Selbst rein mathematisch betrachtet ist das korrekt (schließlich ist die Informatik nur eine Spezialisierung der Mathematik ;) ) - die Rechnungen erfolgen halt alle modulo 256. Guckst du hier: http://de.wikipedia.org/wiki/Kongruenz_%28Zahlentheorie%29
Stimmt, wenn ich nochmal über meine Antwort nachdenke, komme ich zu der gleichen Erkenntnis. Wie war das, "zuerst den Kopf einschalten und dann schreiben". Danke, späte Erkenntnis ist auch eine Erkenntnis. Gruß Frank
>Wie war das, "zuerst den Kopf einschalten und dann schreiben". Macht nix - dafür war ja dein Disclaimer ;) >Kann natürlich sein, dass ich vollkommen falsch liege. Schönes Wochenende, Kai
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.