Inkrementieren/Dekrementieren

Gast #4376284
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
    }
Gast #4376298
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.
#4376300
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.
#4376311
% 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;

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 10 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.