Hallo,
ich möchte eine Logik programmieren, die aus einem Datenstrom mit
Messwerten die beiden kleinsten Werte speichert.
Wenn der kleinste Messwert zwei mal im Datenstrom kommt, dann sollen
beide Speicher diesen Wert erhalten:
Würde das so gehen ?
Dirk F. schrieb:> Würde das so gehen ?
Nimm einen Debugger und guck es dir an, indem du alle möglichen Fälle
durchspielst.
Zwei Vergleichsoperationen sollte reichen: Vergleich des neuen Wertes
mit Min2 und danach Vergleich Min2 mit Min1.
Dirk F. schrieb:> ich möchte eine Logik programmieren, die aus einem Datenstrom mit> Messwerten die beiden kleinsten Werte speichert.
Wenn man sich seine Wünsche und Anforderungen in reiner Textform
aufschreibt und sie durchdenkt, dann wird sehr vieles sehr viel
schneller klar.
Erst wenn man Klarheit erlangt hat, kommt der Programmier-Editor zum
Einsatz.
Norbert schrieb:> Wenn man sich seine Wünsche und Anforderungen in reiner Textform> aufschreibt ...
Ja, nee. Die Textaufgabe muss man dann als erstes wieder als
übersichtliche logische Struktur darstellen, z.B. in Form eines
Nassi-Shneiderman-Diagramms.
Dort sieht man relativ klar, ob man alle Fälle abgedeckt hat und kann
das dann ziemlich direkt in Programmcode umsetzen. Bevor man sich an den
eigentlichen Programmcode macht, sollte man die Testszenarien klar
formulieren, so dass man vollständige Tests für den Code vorliegen hat,
bevor die erste Programmzeile für das eigentliche Programm im Editor
landet.
Rainer W. schrieb:> z.B. in Form eines> Nassi-Shneiderman-Diagramms.> Dort sieht man relativ klar, ob man alle Fälle abgedeckt hat und kann> das dann ziemlich direkt in Programmcode umsetzen.
Finde ich gut.
Insbesondere für so komplexe Aufgaben wie die Ermittlung zweier MIN
Werte. ;-)
Norbert schrieb:> Insbesondere für so komplexe Aufgaben wie die Ermittlung zweier MIN> Werte. ;-)
Wenn ich den Umfang des oben gezeigten Programmcodes sehe, sind solche
grundlegenden Überlegungen, egal wie einfach das Problem ist, hier nicht
fehl am Platz und offenbaren dann schnell mögliche Vereinfachungen.
In anderen Worten: Deine Lösung ist falsch und zu komplex. Zudem in
einer unbekannten Pseudosprache, die vielleicht Sinn macht, in z.B. C
aber nicht. Pseudocode ist zwar OK, aber x[i] sollte die Bedeutung eines
Arrays haben, während spezielle Werte z.B. x_min heißen sollten.
Der übliche Weg wäre für mich: Ein Papier und ein paar Kritzeleien. Je
weniger vertraut Du damit bist, umso mehr echte
Worte/Gleichungen/Pseudocode sind notwendig.
Dirk F. schrieb:> Hier die vereinfachte Version::> ...>> if (aktuell < Speicher1)> {...> return;}> ...> if (aktuell < Speicher2 && aktuell >= Speicher1 )
Du vergleichst immer noch ein Mal zu viel.
Wenn beim ersten Vergleich die Bedingung nicht erfüllt ist, d.h.
1
aktuell >= Speicher1
ist, musst du das beim zweiten Vergleich nicht noch einmal prüfen.
Dirk F. schrieb:> Diese Version ist getestet und läuft:
Auch hier hast du die Vergleichsoperation zwischen dem aktuell Wert und
dem in Speicher1 überflüssigerweise noch doppelt drin.
Dirk F. schrieb:> && *aktuell >= *Speicher1
Ja stimmt. Das kann entfallen.
Aber bei 200 MHz Prozessor und 2 MB Flash, 50 us Zykluszeit...........
was solls....
Dirk F. schrieb:> Aber bei 200 MHz Prozessor und 2 MB Flash, 50 us Zykluszeit...........> was solls....
Welche Bedeutung solche Optimierung im Algorithmus hat, hängt immer
davon ab, ob die Optimierung im Compiler solchen redundanten Code noch
erkennen und rausschmeißen kann und welchen Anteil der Code an der
Prozessorauslastung trägt. Wenn der zu 99% mit leeren Schleifen
beschäftigt ist, spielt es natürlich keine Rolle. Dann ist es nur schade
um die vergeudeten Resourcen.
Die Struktur deines Codes mit dem doppelten Ausgang aus der Funktion
lässt diese Doppelabfrage sowieso nicht erkennen. Besser lesbar wäre,
wenn die zweite Abfrage im else-Zweig der ersten stände und das 'return'
nicht mitten drin.
Dirk F. schrieb:>> && *aktuell >= *Speicher1>> Ja stimmt. Das kann entfallen.
Es MUSS entfallen, denn!
> Aber bei 200 MHz Prozessor und 2 MB Flash, 50 us Zykluszeit...........> was solls....
Nein! Man läßt keinen sinnlosen, irreführend Code stehen! Erst recht
nicht, wenn man WEIß, daß es so ist!
Google clean code
Strukturierte Programmierung auf Mikrocontrollern