Forum: Mikrocontroller und Digitale Elektronik Variable decementieren


von Ingo (Gast)


Lesenswert?

Hallo,

Kann man eine Variable auch anders als
1
 If (var) var--;
Von einem beliebigen wert bis auf 0 decremntieren? Is n AVR.

Reine Kosmetik, die Version mit dem ? gefällt mir auch nicht.


Ingo

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

1
var -= !!var
Ich seh aber net was daran besser oder klarer sein soll.

: Bearbeitet durch User
von Ingo (Gast)


Lesenswert?

Nee, nicht wirklich, zumal ich nicht mal verstehe was da passiert ;)

von Roland .. (rowland)


Lesenswert?

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.

von Detlef K. (adenin)


Lesenswert?

1
for(;var;var--);

von D. V. (mazze69)


Lesenswert?

Ein Anti-Betonbauer decementiert.
Bin bisher aber noch keinem dieser Berufgruppe begegnet.

von Ingo (Gast)


Lesenswert?

Müsste man mal gucken was der Kompiler aus den Verianten baut...


Ich hatte erst diese Variante, funktioniert aber logischerweise nicht:
1
if (var--);

Aber das klappt ja wie gesagt nicht, die Sache mit der for Schleife hat 
irgebwie was.

von Rolf Magnus (Gast)


Lesenswert?

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
1
while (var--)

Oder wenn du's besonders graphisch willst:
1
while (var --> 0)

von B. S. (bestucki)


Lesenswert?

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:
1
if(!var--){
2
  var=0;
3
}

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:
1
while(i--);

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.

: Bearbeitet durch User
von Ein Gast (Gast)


Lesenswert?

1
var = 0;
Noch kürzer und schneller gehts nicht.

Aber ist es nicht etwas sinnlos ein Programm zu schreiben, das intern 
bis 0 zählt?

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Detlef Kunz schrieb:
>
1
 for(;var;var--);

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

von Rolf Magnus (Gast)


Lesenswert?

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.

von Roland .. (rowland)


Lesenswert?

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.

von Chris (Gast)


Lesenswert?

Rolf Magnus schrieb:
> Dann kannst du aber auch gleich schreiben
> while (var--)

steht var danach bei 0 oder -1?

von Rolf Magnus (Gast)


Lesenswert?

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.

von Rolf Magnus (Gast)


Lesenswert?

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.

von petar (Gast)


Lesenswert?

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.

von Detlef K. (adenin)


Lesenswert?

dann mach doch
1
while (--var);
^^

von Dr. Sommer (Gast)


Lesenswert?

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.

von Marian (phiarc) Benutzerseite


Lesenswert?

Mit dem downto-Operator (-->) geht das.

von Rolf Magnus (Gast)


Lesenswert?

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?

von Luther B. (luther-blissett)


Lesenswert?

1
var && var--;

von Dr. Sommer (Gast)


Lesenswert?

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.

von Ingo (Gast)


Angehängte Dateien:

Lesenswert?

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

von Ingo (Gast)


Lesenswert?

ist übrigens eine Atmega128 @ 16MHz...

von Karl H. (kbuchegg)


Lesenswert?

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
1
...
2
   if (Startupdelay)
3
     Startupdelay--;
4
...

aber ansonsten gibt es ausser dieser zugegebenermassen GEschmackssache 
daran nichts auszusetzen.

von Ingo (Gast)


Lesenswert?

Karl Heinz schrieb:
> aber ansonsten gibt es ausser dieser zugegebenermassen GEschmackssache
> daran nichts auszusetzen.

Am Gesamtcode oder am Codeschnippsel?

von Karl H. (kbuchegg)


Lesenswert?

Ingo schrieb:
> Karl Heinz schrieb:
>> aber ansonsten gibt es ausser dieser zugegebenermassen GEschmackssache
>> daran nichts auszusetzen.
>
> Am Gesamtcode oder am Codeschnippsel?

Am Schnipsel.

von Peter D. (peda)


Lesenswert?

Luther Blissett schrieb:
> var && var--;

Hübsch.

von Luther B. (luther-blissett)


Lesenswert?

Ich würde "startupdelay" explizit verwenden, d.h. Konstrukte wie
1
if (!startupdelay) {...}
 die "startupdelay" als bool verwenden (obwohl es ein Zählerwert ist) 
vermeiden. Also:
1
if (startupdelay>0) 
2
 startupdelay--;

Dieser Schritt kann natürlich auf alle möglichen Weisen paraphrasiert 
werden, z.B:
1
startupdelay -= (startupdelay>0);

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
1
for (;;) { /*...*/ }
 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.

von Reinhard Kern (Gast)


Lesenswert?

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

von Marian (phiarc) Benutzerseite


Lesenswert?

Wie gesagt, mit dem Downto-Operator lässt sich das alles viel besser 
lesbar ausdrücken! ;D

von Karl H. (kbuchegg)


Lesenswert?

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
1
int main()
2
{
3
  while( !sleeping() )
4
    count( sheep() );
5
6
  sleep();
7
}

: Bearbeitet durch User
von Amateur (Gast)


Lesenswert?

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.

von Mark B. (markbrandis)


Lesenswert?

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.

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.