Modulo schneidet aber alles nach dem Komma ab.
Damit ist Deine Vorlage ungeeignet um das unterschiedliche Verhalten zwischen millis() und % darzustellen.
Da springt nichts 2ms!
Du verlierst EINE ms.
Und zwar genau die, die Du eigentlich mit Deinem Code bekommst.
Ich weiss, was Du erklären willst. Aber das hast Du nicht gemacht.
Und darauf ist @michael_x reingefallen.
Ja,
da wird EINE ms gezählt und EINE ms aufaddiert aus dem Nachkomma.
Da springt nichts 2ms!
Denn wie Du selbst merken wirst, wird irgendwann mal das aufaddieren nicht nach 42ms passieren, weil es eben ein aufaddieren ist. Nicht mehr.
Deine beiden returns sorgen dafür das die Hauptprogrammschleife urplötzlich verlassen wird. Es gibt keinen vernünftigen Grund sowas jemals zu tun. Bei dem Programmierstil wird nachfolgender Code holprig bis gar nicht abgearbeitet. Formuliere die if Bedingung so das nur was ausgeführt wird wenn erforderlich. Ansonsten soll nachfolgender Code abgearbeitet werden soweit vorhanden.
Nach Prüfung verlassen. Natürlich kann man den Code auch so schreiben:
unsigned long last;
void setup() {
Serial.begin(115200);
last = millis();
}
void doIt() {
auto now = millis();
if (now != last) {
if ((now - 1) == last) {
last = now;
} else {
Serial.println(now);
last = now;
}
}
}
void loop() {
doIt();
}
Aber ob das einfacher zeigt, das man bei millis() keinen X == Y -vergleich machen sollte, wage ich zu bezweifeln.
Ich glaube ich kann mich glücklich schätzen, das da keine Ressourcen allokiert wurden, die am Ende wieder freigegeben werden müssen, da du sonst noch ein paar gotos gesehen hättest...
if ((now - 1) == last) {
last = now;
} else {
last = now;
}
Es ging um das return!
Die aufgerufene Funktion kann man mittels return verlassen. Da spricht nichts dagegen.
Kann ich auch nicht nachvollziehen. Mit now wird auch Speicher belegt der
automatisch wieder freigegeben wird. last würde ich übrigens lokal machen. Aber wofür der Aufwand wenn das ganze Kontrukt sowieso Verkompliziert und Unsinn ist ...
Wenn du das Rad unbedingt neu erfinden möchtest meinetwegen. Zum nachahmen aber nicht empfohlen.
Ich habe es auf das Wesenliche reduziert ohne die Funktionalität von deinem if else zu ändern. Normalerweise solltest du auf Grund dessen sehen was daran sinnlos ist, weil es ins Auge sticht. Wenn du es komplett benötigst dann eben so. Ändert daran nichts.
void doIt() {
auto now = millis();
if (now != last) {
if ((now - 1) == last) {
last = now;
} else {
last = now;
}
}
}
Wer etwas von Heap und Stack erzählt der wird wohl Grundkenntnisse haben wie man eine lokale Variable anlegt. Dazu musst du mich sicherlich nicht fragen.