Gast
#3508863
Hallo, Kann man eine Variable auch anders als
1 | |
Von einem beliebigen wert bis auf 0 decremntieren? Is n AVR. Reine Kosmetik, die Version mit dem ? gefällt mir auch nicht. Ingo
|
Anzeige
|
Variable decementieren
Gast
#3508863
Hallo, Kann man eine Variable auch anders als
Von einem beliebigen wert bis auf 0 decremntieren? Is n AVR. Reine Kosmetik, die Version mit dem ? gefällt mir auch nicht. Ingo
Ich seh aber net was daran besser oder klarer sein soll.
Gast
#3508883
Nee, nicht wirklich, zumal ich nicht mal verstehe was da passiert ;) Mit !var wird die Variable negiert und nach bool gecastet. Mit nochmal '!' wird die negation aufgehoben, es bleibt also ein Wert von 0 oder 1. Dieser Wert wird von 'var' abgezogen, also 1 solange var vorher einen Wert ungleich 0 hatte, andernfalls 0, eben kein abzug mehr.
Ein Anti-Betonbauer decementiert. Bin bisher aber noch keinem dieser Berufgruppe begegnet.
Gast
#3508940
Müsste man mal gucken was der Kompiler aus den Verianten baut... Ich hatte erst diese Variante, funktioniert aber logischerweise nicht:
Aber das klappt ja wie gesagt nicht, die Sache mit der for Schleife hat irgebwie was.
Gast
#3508953
Ingo schrieb: > Aber das klappt ja wie gesagt nicht, die Sache mit der for Schleife hat > irgebwie was. Dann kannst du aber auch gleich schreiben
Oder wenn du's besonders graphisch willst:
Was stört dich an deiner Variante? Ist übersichtlich, kurz und jeder sieht was passiert. Ingo schrieb: > Ich hatte erst diese Variante, funktioniert aber logischerweise nicht: > if (var--); So würds funzen:
Ingo schrieb: > Aber das klappt ja wie gesagt nicht, die Sache mit der for Schleife hat > irgebwie was. Geschmackssache. Wenn, dann würde ich folgendes schreiben:
Ingo schrieb: > Reine Kosmetik Schönheit ist relativ. Roland ... schrieb: > Mit !var wird die Variable negiert und nach bool gecastet. Laut K&R ist das Resultat int. Sowas wie bool gibt es nicht. EDIT: Schreib doch mal was du genau tun willst und/oder poste deinen Code. Dann können wir dir den "üblichen" Weg zeigen, sowas hinzuschreiben.
Gast
#3508979
Noch kürzer und schneller gehts nicht. Aber ist es nicht etwas sinnlos ein Programm zu schreiben, das intern bis 0 zählt? Detlef Kunz schrieb: >
Nö, das mach effektiv var = 0. Andere Werte von var bekommst du nie zu sehen, was im Originalcode jedoch der Fall ist (z.B. rein: var=2, raus: var=1).
Gast
#3508985
Ein Gast schrieb: > Aber ist es nicht etwas sinnlos ein Programm zu schreiben, das intern > bis 0 zählt? Die Vermutung liegt nahe, daß das Zählen nicht das einzige ist, was das Programm machen soll. be stucki schrieb: > Laut K&R ist das Resultat int. Sowas wie bool gibt es nicht. Zumindest liegt das Ergebnis von '!!var' danach im Wertebereich die auch eine bool abdeckt, also nur mehr zwei Zustände.
Gast
#3508995
Rolf Magnus schrieb: > Dann kannst du aber auch gleich schreiben > while (var--) steht var danach bei 0 oder -1?
Gast
#3509001
Roland ... schrieb: > be stucki schrieb: >> Laut K&R ist das Resultat int. Sowas wie bool gibt es nicht. > > Zumindest liegt das Ergebnis von '!!var' danach im Wertebereich die auch > eine bool abdeckt, also nur mehr zwei Zustände. Außerdem gibt es sehr wohl sowas wie bool in C. Allerdings erst seit 15 Jahren.
Gast
#3509006
Chris schrieb: > Rolf Magnus schrieb: >> Dann kannst du aber auch gleich schreiben >> while (var--) > > steht var danach bei 0 oder -1? var steht danach bei -1. Der Schleifeninhalt wird aber nur bis 0 ausgeführt.
Gast
#3509017
Rolf Magnus schrieb: > Chris schrieb: >> Rolf Magnus schrieb: >>> Dann kannst du aber auch gleich schreiben >>> while (var--) >> >> steht var danach bei 0 oder -1? > > var steht danach bei -1. Der Schleifeninhalt wird aber nur bis 0 > ausgeführt. Nur wenn var vorzeichenbehaftet ist. dann mach doch
^^
Gast
#3509042
Rolf Magnus schrieb: > Außerdem gibt es sehr wohl sowas wie bool in C. Allerdings erst seit 15 > Jahren. Wer redet überhaupt von C? In C wäre der Code vom OP jedenfalls ungültig, da "if" dort klein geschrieben wird. Mit dem downto-Operator (-->) geht das.
Gast
#3509213
Dr. Sommer schrieb: > Rolf Magnus schrieb: >> Außerdem gibt es sehr wohl sowas wie bool in C. Allerdings erst seit 15 >> Jahren. > Wer redet überhaupt von C? be stucki, in dem Posting auf das sich meine Antwort bezieht. Dr. Sommer schrieb: > In C wäre der Code vom OP jedenfalls ungültig, da "if" dort klein > geschrieben wird. Welche Sprache wäre dir denn bekannt, die es auf dem AVR gibt und wo die Zeile genau so wie sie da steht passt?
Gast
#3509394
Rolf Magnus schrieb: > Welche Sprache wäre dir denn bekannt, die es auf dem AVR gibt und wo die > Zeile genau so wie sie da steht passt? Keine Ahnung, vielleicht hat der OP eine Geheimsprache dafür? Er verrät ja nichts.
Gast
#3509829
Dr. Sommer schrieb: > Keine Ahnung, vielleicht hat der OP eine Geheimsprache dafür? Er verrät > ja nichts. Es ist C. Ein Gast schrieb: > Aber ist es nicht etwas sinnlos ein Programm zu schreiben, das intern > bis 0 zählt? Bestehen deine Programme nur aus einer Zeile? Meine meist nicht ;) Rolf Magnus schrieb: > Die Vermutung liegt nahe, daß das Zählen nicht das einzige ist, was das > Programm machen soll. So ist es... Anbei der Hauptcode. Es handelt sich um einen 3 phasigen PWM-Sinusgenerator, Ausgabe der PWMs erfolgt über Timer1, das Nachladen neuer Werte aus der LUT erfolgt durch Timer3. PWM Frequenz ist 10kHz, die Sinustabelle hat 90 Werte. In Abhängigkeit von PA1 wird von der Anfangsfrequenz von 3Hz eine Frequenzrampe mit 1Hz/s bis auf 50Hz hochgefahren oder sofort 50Hz bereitgestellt. Man kann erkennen das das Decrementieren der Variable Startupdelay meiner Frage entspricht. Ingo
Gast
#3509844
ist übrigens eine Atmega128 @ 16MHz... Und was gefällt dir da jetzt nicht daran? Der Code ist kurz, übersichtlich, leicht zu verstehen, kann vom Compiler problemlos optimal umgesetzt werden. Ich würds im Sinne der Konsistenz anders formatieren
aber ansonsten gibt es ausser dieser zugegebenermassen GEschmackssache daran nichts auszusetzen.
Gast
#3509861
Karl Heinz schrieb: > aber ansonsten gibt es ausser dieser zugegebenermassen GEschmackssache > daran nichts auszusetzen. Am Gesamtcode oder am Codeschnippsel? Ingo schrieb: > Karl Heinz schrieb: >> aber ansonsten gibt es ausser dieser zugegebenermassen GEschmackssache >> daran nichts auszusetzen. > > Am Gesamtcode oder am Codeschnippsel? Am Schnipsel. Luther Blissett schrieb: > var && var--; Hübsch. Ich würde "startupdelay" explizit verwenden, d.h. Konstrukte wie
die "startupdelay" als bool verwenden (obwohl es ein Zählerwert ist) vermeiden. Also:
Dieser Schritt kann natürlich auf alle möglichen Weisen paraphrasiert werden, z.B:
nur haben diese Idiome nur dann einen Sinn wenn sie dem Compiler tatsächlich dazu bringen, besseren Code zu erzeugen (Ausdrücke die etwa in verzwiegungfreien Code umgesetzt werden können, sind unter manchen Architekturen schneller) oder helfen Programmierfehler zu vermeiden. Das ist hier aber nicht gegeben wie ich das sehe. Bzgl. des ersten Zwecks (bessere Codegenerierung) könnte dich diese Seite interessieren: http://graphics.stanford.edu/~seander/bithacks.html Bzgl. des zweiten Zwecks schlage ich vor die Endlosschleife durch
auszudrücken, weil die meisten Compiler heutzutage für konstante
Schleifenbedingungen ("while(1)") eine Warnung ausgeben können - es ist
nämlich oftmals ein Programmierfehler.
Gast
#3510001
Peter Dannegger schrieb: > Luther Blissett schrieb: >> var && var--; > > Hübsch. Hübsch vielleicht, aber halt typischer C-Write-Only-Code. Nach dem Grundsatz, ein Programm muss so unverständlich wie nur möglich formuliert werden. Bei Anwendung moderner Softwareproduktionsmethoden völlig inakzeptabel. Gruss Reinhard Wie gesagt, mit dem Downto-Operator lässt sich das alles viel besser lesbar ausdrücken! ;D Schon gut, Marian. Wir haben alle den Joke gesehen. Allerdings ist der soooooo lustig dann auch wieder nicht. Er ist fast so lustig, wie der hier Q: Was macht ein Computer, wenn es nichts zu tun gibt? A: Er führt das Programm aus
Gast
#3510138
Wenn ich davon ausgehe, dass die Optimierung des Compilers in Ordnung ist und ich den ganzen Sermon auch später nochmal überfliegen muss, so käme für mich nur: if (var!=0)--var; infrage. Notfalls auch noch: if (var)--var; Aber ich mag die implizite Typumwandlung nicht. Das Resultat dürfte in den meisten Fällen das gleiche sein. Konstrukte wie: for(;var;var--); oder while (--var); oder gar var && var--; sind in meinen Augen etwas für Masochisten. Reinhard Kern schrieb: > Hübsch vielleicht, aber halt typischer C-Write-Only-Code. Nach dem > Grundsatz, ein Programm muss so unverständlich wie nur möglich > formuliert werden. Bei Anwendung moderner Softwareproduktionsmethoden > völlig inakzeptabel. Genau. Für sowas gibt es den IOCCC. In produktiv eingesetztem Code hat sowas nichts, aber auch gar nichts verloren. Antwort schreibenBitte melde dich an, um einen Beitrag zu schreiben. |
Anzeige
|