Codevereinfachung Modulo

Hallo,

per Modulo kann man das hier vereinfachen.

layerPattern++;
    if(layerPattern > 3) layerPattern = 0;

Leider weiss ich nicht mehr wie.

Bitte um Hilfe!

Gruß Chris

falls Du damit vielfache von 4 abfragen willst:

if (layerPattern % 4) == 0))

gruß stefan

Da stimmt glaub was nicht.

Sobald layerPattern größer als 3 ist, soll layerPattern auf 0 gesetzt werden.

Gruß Chris

Du meinst sicher

layerPattern ++;
layerPattern = layerpattern  % 4;

Bei 2 / 4 / 8 /16 … kann man das modulo noch vereinfachen:

layerPattern = ++layerPattern & 0x03 ; // 0 -> 1 -> 2 -> 3 -> 0 -> ...

Falls der Compiler das (bei Konstanten) nicht von alleine so macht.

Probier mal:

uint8_t layerPattern1, layerPattern2;

void setup() {
  Serial.begin(9600);
  Serial.println("Programmanfang");
}


void loop() {
  Serial.print("layerPattern1: ");
  Serial.print(layerPattern1);
  Serial.print("  layerPattern2: ");
  Serial.println(layerPattern2);
  layerPattern1++;
  layerPattern2++;
  if (layerPattern1 > 3) layerPattern1 = 0;
  layerPattern2 = layerPattern2 % 4;
}
Programmanfang
layerPattern1: 0  layerPattern2: 0
layerPattern1: 1  layerPattern2: 1
layerPattern1: 2  layerPattern2: 2
layerPattern1: 3  layerPattern2: 3
layerPattern1: 0  layerPattern2: 0
layerPattern1: 1  layerPattern2: 1
layerPattern1: 2  layerPattern2: 2
layerPattern1: 3  layerPattern2: 3
layerPattern1: 0  layerPattern2: 0
layerPattern1: 1  layerPattern2: 1

uint8_t zum Üben für 32 Bit µC. :wink:

Eine andere Möglichkeit bieten "bedingte Zuweisungen",
eine von mir gerne genutzte und besonders in PHP sehr häufig genutzte Variante:

layerPattern = ( layerPattern > 3 ) ? 0 : layerPattern +1;

michael_x:
Du meinst sicher

layerPattern ++;

layerPattern = layerpattern  % 4;

Jaaa- genau!

Dankeschön.

Gruß Chris

RudiDL5:
Eine andere Möglichkeit bieten "bedingte Zuweisungen",
eine von mir gerne genutzte und besonders in PHP sehr häufig genutzte Variante:

layerPattern = ( layerPattern > 3 ) ? 0 : layerPattern +1;

Prinzipiell richtig, geht nur eins zu weit, weil du erst hinterher addierst, oder die Grenze falsch abfragst.
(und bei undefinierten (negativen) Anfangswerten dauert es lang, bis das Ganze richtig wird)
layerPattern ist natürlich nicht int, und fängt definiert an. :wink:

Joa, ist mir bekannt und bewusst. Kommt auch immer darauf an, wie die Vorbedingungen der Sache sind und ob man solche Fallen vorab ausschließt :wink: Bedingte Zuweisungen verbrauchen sogar mehr Speicher als obige Modulo-Abfragen.

Der Compiler ist verdammt clever, dem würde ich bei % 4 zutrauen, daß er daraus ein & 3 macht. Bei % 5 dürfte das dann anders aussehen, da würde ich (in obigem Fall) auch eher die bedingte Zuweisung benutzen.

Zum Ausprobieren reicht meist ein dummy Sketch, den man nur compiliert und dann den Speicherbedarf anschaut. Mir sind so ein paar interessante Dinge aufgefallen, siehe neuer Thread (Richtig optimieren). Dort stehen auch diverse Varianten für Modulo drin, die Ergebnisse haben mich selbst überrascht.