3 Byte nacheinander vergleichen und inkrementieren

#6967859
Lesenswert?

Hallo,

ich stehe gerade leider total auf dem Schlauch und möchte weiterkommen.
Ich habe auf einem PIC16F (XC8 Compiler) drei Byte, die ich von einem 
Startwert erhöhen möchte auf einen vorgegebenen Endwert.
Ich muss irgendwo einen Denk- bzw. Codefehler haben, da nicht das von 
mir erwartete (bzw. gewünschte) eintritt.
Vlt. fällt er jemanden von euch auf die Schnelle auf.

Vielen Dank und Grüße vorab.

Die xxx_byte werden vorher noch auf die Startwerte gesetzt (die 
niedriger als die Endwerte sind).
1
if(upper_byte<=upper_byte_end)
2
                {
3
                    if(high_byte<=high_byte_end)
4
                    {
5
                        if(low_byte<low_byte_end)
6
                        {
7
                            low_byte++;
8
                            if(low_byte==0)     // Check overflow
9
                            {
10
                                high_byte++;
11
                                if(high_byte==0)
12
                                {
13
                                    if(upper_byte<255)
14
                                    {
15
                                        upper_byte++;
16
                                    }
17
                                }
18
                            }
19
                        }
20
                    }
21
                }
Gast #6967935
Lesenswert?

Joe S. schrieb:
> Mit dem Tipp habe ich es nun hinbekommen.

Eigentlich war das kein Tipp, sondern ein offensichtlicher/markanter 
Sprung in der Logik, welcher eine ganze Latte Fragezeichen aufgeworfen 
hat.

Joe S. schrieb:
> Manchmal hat man so eine Denkblockade, oh weh oh weh...

Jetzt kommt ein Tipp:
Das sind die if Kaskaden.
Die machen Knoten in die Hirnwindungen.
Der Verzicht auf solche Kaskaden, schafft Klarheit.

Das Programmierer Genie zeichnet sich übrigens nicht dadurch aus, dass 
es beliebig tiefe Kontrollstrukturen im Blickfeld behalten kann, sondern 
dadurch dass er/sei/es diese Komplexität auflösen/abflachen kann.
Gast #6968508
Lesenswert?

EAF schrieb:
> Jetzt kommt ein Tipp:
> Das sind die if Kaskaden.
> Die machen Knoten in die Hirnwindungen.
> Der Verzicht auf solche Kaskaden, schafft Klarheit.

Ich habe zwar keine Ahnung, wie der Code des TO jetzt aussieht, aber 
eine gute Lösung wird kaum kleiner oder eleganter sein als im OP.

Oder hast Du eine alternative, unter der Annahme 3 einzelne Bytes? (Und 
ja, eine 16 Bit Variable macht es deutlich eleganter.
Gast #6968585
Lesenswert?

A. S. schrieb:
> aber
> eine gute Lösung wird kaum kleiner oder eleganter sein als im OP.
6 geschachtelte if scheinen mir nicht sonderlich elegant zu sein.

A. S. schrieb:
> der hast Du eine alternative
Da ich den Algorithmus/Problem/Aufgabe/Sinn/Zweck nicht verstehe, leider 
nein.
z.B. sind die Endwerte konstant, oder variabel?
Wohin soll optimiert werden? Lesbarkeit oder Speed?
Ohne Kontext keine Chance.

Einen Bock habe ich ja schon gezeigt.....
Den zweiten identischen schießt er mit high_byte
Das macht schon mal 2 if weniger, liegt damit deutlich auf meiner 
Wunschlinie.

Tendenziell, würde versuchen die Variablen irgendwie zusammen zu fassen.
z.B. in einem Array, einer Struktur, oder gar, wenn die Endwerte zu 2er 
Potenzen passen in ein Bitfeld. Wenn * oder / Rechnungen nicht zu teuer 
sind, auch in einer 32Bit Variablen, denn dann reicht ein Vergleich auf 
Endwert, und nur ein Increment.
Potentielle Möglichkeiten gibt es satt.

Als Hürde kommt hinzu, dass ich weder den µC noch den Compiler im 
Zugriff habe.


Also nein!
Ich habe keinen konkreten besseren Vorschlag. So ist das einzige 
"Besser" welches mir KONKRET einfällt, die Anzahl ifs zu reduzieren.

Mantra:
> Jedes vermiedene if ist ein gutes if.
> Jedes vermeidbare if ist ein böses if
Zwischen den beiden Grenzen findet sich eine Hysterese, dort wo die 
unvermeidbaren/notwendigen if stecken.
Gast #6968777
Lesenswert?

Joe S. schrieb:
> Zuletzt lese ich aus der long Variable die einzelnen Byte wieder aus.

Darf man denn dann fragen, warum Du die Bytes einzeln brauchst? Falls es 
wegen Serialisierung ist, dann lieber dazu nachfragen.

Die Verwendung von 3 einzelnen Bytes (nicht mal ein Array oder eine 
Struktur) ist nur sehr selten zielführend. Manchmal unterstützen 
Compiler für kleine Prozessoren sogar 24 Bit Integer direkt
Gast #6969250
Lesenswert?

Wittgenstein:
>Ich habe einen Schmerz in Ihrem Oberarm.

https://www1.wdr.de/radio/wdr5/sendungen/philosophisches-radio/wilhelm-vossenkuhl-100.html

Joe S. schrieb:
> ... total auf dem Schlauch.

EAF schrieb:
> Ich kann solche If Kaskaden nicht leiden.

Teo D. schrieb:
>><(()°> ?-/

Justus schrieb:
> Seid ihr alle neben der Kappe?
> GRÖL :-]]]]]

ack cfm Jöuh!

Weiter Lustig Und Vergnügt Bis Der Arsch Im Grabe Liegt.
#6969375
Lesenswert?

A. S. schrieb:

> Die Verwendung von 3 einzelnen Bytes (nicht mal ein Array oder eine
> Struktur) ist nur sehr selten zielführend. Manchmal unterstützen
> Compiler für kleine Prozessoren sogar 24 Bit Integer direkt

Der Prozessor nicht direkt, aber der Compiler. Kann man sogar auf dieser 
Website nachlesen:

https://www.mikrocontroller.net/attachment/211304/MPLAB_XC8_C_Compiler_User_s_Guide_1_2.pdf

oder ganz aktuell beim Hersteller:

https://www.microchip.com/content/dam/mchp/documents/DEV/ProductDocuments/UserGuides/50002737D.pdf

S. 89, __uint24, little-endian

Dann braucht man exakt Null ifs und die Variable hat auch kein Byte zu 
viel.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren