Forum: Mikrocontroller und Digitale Elektronik Inkrementieren/Dekrementieren


von Marion (Gast)


Lesenswert?

Hallo,

kann man das noch weiter verbessern?
1
    const uint16_t maxShift = 359;
2
    static int16_t shift = 0;
3
    const int16_t step = 85;
4
5
    if(step > 0)
6
    {
7
      shift = (shift + step) % maxShift+1;
8
    }
9
    else if(step < 0)
10
    {
11
      if(shift - step < 0) shift = maxShift - (shift - step);
12
      else shift = (shift - step);
13
    }

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Kommentieren / Dokumentieren, was das soll.

von faultier (Gast)


Lesenswert?

Marion schrieb:
> Hallo,
>
> kann man das noch weiter verbessern?

Hallo, ja!

von Marion (Gast)


Lesenswert?

Möchte eine Variable hoch oder runterzählen lassen, je nachdem ob step 
positiv oder negativ ist. Der Werte Bereich soll dann von 0 - 359 (inkl. 
Überlauf) gehen.

von Wolfgang (Gast)


Lesenswert?

Marion schrieb:
> kann man das noch weiter verbessern?

Das kommt auf die verfügbare Hardware und auf das Kriterien für "besser" 
an.

von Karl H. (kbuchegg)


Lesenswert?

Marion schrieb:

>       shift = (shift + step) % maxShift+1;

Da maxShift hier wohl im allgemeinen Fall keine 2-er Potenz sein wird, 
würde ich dir hier von einer % Operation abraten. Das +1 dürfte hier 
auch falsch sein, es sei denn du machst da eine Klammer drum herum
1
        shift += step;
2
        while( shift > maxShift )
3
          shift -= maxShift + 1;

das hier
1
>     }
2
>     else if(step < 0)
3
>     {
4
>       if(shift - step < 0) shift = maxShift - (shift - step);
5
>       else shift = (shift - step);
6
>     }

ist mir ehrlich gesagt zu gekünstelt. Da du sowieso mit Vorzeichen 
rechnest:
1
       shift += step;
2
       while( shift < 0 )
3
         shift += maxShift + 1;

Ob da jetzt jeweils eine Korrektur um +1 sein muss oder nicht, hängt 
davon ab, ob der Wert maxShift auch erlaubt ist oder nicht. Ich würde 
allerdings hier nicht in den Berechnungen immer +1 rechnen, sondern den 
Wert maxShift an sich um 1 höher halten. Lässt sich ja einfach beim 
Setzen bzw. Auslesen des Wertes berücksichtigen. Der Grund ist simpel: 
den Wert verändern wird man wohl eher selten, jedoch häufiger anwenden. 
Dann spar ich dem µC beim Anwenden das ständige +1 dazurechnen, während 
es beim Verändern als Operation unter "ferner liefen" fungiert.

: Bearbeitet durch User
von Karl H. (kbuchegg)


Lesenswert?

Karl H. schrieb:

> Da maxShift hier wohl im allgemeinen Fall keine 2-er Potenz sein wird,
> würde ich dir hier von einer % Operation abraten.


Edit:
Es sei denn natürlich, dein unbekannter Computer kann Divisionen in 
Hardware durchführen.

von Marion (Gast)


Lesenswert?

Ja, die Klammer hat gefehlt.

von Clemens L. (c_l)


Lesenswert?

% bindet stärker als + (und da helfen Leerzeichen auch nicht, der 
Compiler will Klammern sehen).

Und auch bei negativem step wäre eine Addition richtig.

Viel einfacher so:
1
shift += step;
2
if (shift < 0)
3
  shift += maxShift+1;
4
else if (shift > maxShift)
5
  shift -= maxShift+1;

: Bearbeitet durch User
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.