Forum: Mikrocontroller und Digitale Elektronik Variable nur jeden x-ten Schritt weiterzählen


von Jannik (Gast)


Lesenswert?

Hallo,

hat mal jemand eine Idee für mich, wie ich folgendes in C am 
sinnvollsten realisieren kann?

Möchte ein Variable in einer Schleife nicht jedes mal, sondern nur alle 
x-Schritte um eins erhöhen. Wie stellt man soetwas am sinnvollsten an?

von Mirko W. (Gast)


Lesenswert?

Je nachdem, wie unkompliziert die Lösung sein darf, würde ich eine 
zweite, innere Schleife einführen, die x-mal läuft.

von Segler (Gast)


Lesenswert?

Eine andere Möglichkeit wäre sowas wie
1
variable += (schleifenzaehler % x)==(x-1) ? 1 : 0;

von Jacko (Gast)


Lesenswert?

schritt = 0;

while (1)
{ if (++schritt == x)
  {  schritt = 0;
     variable++;
  }
  ...
  ...
}

von Alex (Gast)


Lesenswert?

Ginge folgender Ansatz (bin kein C Experte und hab keinen C Compiler 
aufm Rechner):

Wenn i die Variable ist, die hochgezählt wird, steht in der Schleife 
normalerweise i++ (equivalent zu i+i).

Ersetze das mit einer Hilfsvariablen a: i+a

Innerhalb der Schleife wird eine if Abfrage gesetzt. Wenn die wahr ist, 
wird a auf 1 gesetzt. Dann stünde in der Schleife i+1.

Wenn die Bedingung nicht wahr ist, wird a auf 0 gesetzt.

Passt das?

von Schmidt Sebastian (Gast)


Lesenswert?

Man braucht eigentlich nicht mal eine zweite  Schleife.

Dies kann man problemlos in der eigentlichen zählschleife abhandeln
Eine weitere variable definieren und diese wird auch mit jeden Durchlauf 
erhöht.

Nur das man dort dann eben prüft ob der stand beispielsweise schon 3 
ist, falls ja variable 1 erhöhen und variable zwei auf 0 zurücksetzen 
fertig

von H. K. (spearfish)


Lesenswert?

Mit der Modulo-Operation (%, Division mit Rest) geht das: 
https://de.wikipedia.org/wiki/Division_mit_Rest

Für jeden zweiten Schritt prüfst du ob dein Schleifenzähler i%2=0 
ergibt.... denn wenn i durch zwei teilbar ist (und das ist i bei jedem 
zweiten Schritt), ergibt diese Operation eben 0.

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

Alex schrieb:
> Passt das?

 Kaum.

 Auch wenn die Lösung von Segler kürzer aussieht, die Lösung von
 Jacko ist die kürzeste und schnellste.

von Jacko (Gast)


Lesenswert?

>> variable += (schleifenzaehler % x)==(x-1) ? 1 : 0;

Das ginge hübscher mit

variable += (schleifenzaehler % x) ? 0 : 1;

ABER:
Wenn so eine Zählvariable eine begrenzte Ganzzahl ist, hat man
auch noch (da sie nie auf Null zurückgesetzt wird) das Problem
des Überlaufs!

Einfacher Fall:
x = 7,
Schleifenzähler ist eine uint8 (0...255)
Bis 252 (= 36 * 7) klappt es.
259  (= 37 * 7) wird aber zu 3, also ist die nächste
Erhöhung erst nach 10 Schritten.

Mit Long Int kommt der Fehler auch, nur seltener. ;-)

Also nimm meine obengenannte Lösung!

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.