Forum: Mikrocontroller und Digitale Elektronik Zusammenfassen/Vereinfachen von if-Abfragen


von Timo (Gast)


Lesenswert?

Hallo,

ich habe das Problem dass mein Code langsam total uübersichtlich wird. 
Der Grund sind viele zusammenhängende if-Abfragen. Hat jemand ne Idee, 
wie folgenes (nur Beispiel) zu vereinfachen bzw. zusammenzufassen wäre:
1
if(count <= 15)
2
{
3
  button2 = 0x02;
4
}
5
6
else if(count <= 30)
7
{
8
  button2 = 0x00;
9
}
10
11
else if(count <= 45)
12
{
13
  button2 = 0x02;
14
}
15
16
else if(count <= 60)
17
{
18
  button2 = 0x00;
19
}
20
21
else if(count <= 75)
22
{
23
  button2 = 0x02;
24
}
25
26
else if(count <= 90)
27
{
28
  button2 = 0x00;
29
}
30
31
else if(count <= 105)
32
{
33
  button2 = 0x02;
34
}

Krieg es einfach nicht hin......

: Bearbeitet durch User
von fjgh (Gast)


Lesenswert?

Such mal nach "case"

von Дуссель дукъ (Gast)


Lesenswert?

Nee "case" kann keine Bereiche.
Etwas eleganter :

found = false

if (not found) and (x<..) { found = true; .. }

von Zittermann (Gast)


Lesenswert?

Дуссель дукъ schrieb:

>Nee "case" kann keine Bereiche.

Dann nimm Bascom. Dessen "select case" kann Bereiche auswerten.

gez. Zittermann

von Peter II (Gast)


Lesenswert?

fjgh schrieb:
> Such mal nach "case"

und was soll das bringen?

auf die schnelle würde ich sagen

button2 = (((count+1)/15)&1) ? 0x02 : 0x00;

: Bearbeitet durch User
von Marcel (Gast)


Lesenswert?

x = count / 15;

ist x gerade button2 = 0
sonst button2 = 2

von Uwe (de0508)


Lesenswert?

Hallo  Timo

man die IF-THEN-ELSE Schachtelung auch als Macro ausführen, dann sieht 
es etwas kompakter aus.
1
#define COMP(arg, statement) \
2
if(count <= (arg)) \
3
do { statement } while(0) \
4
else


Beispiel
1
COMP(15,code1)
2
COMP(30,code2)
3
{ }

: Bearbeitet durch User
von Micha (Gast)


Lesenswert?

Дуссель дукъ schrieb:
> Nee "case" kann keine Bereiche.
> Etwas eleganter :

Hm, ich glaube der GCC kann das auch in C (als specifische Erweiterung)
http://gcc.gnu.org/onlinedocs/gcc-4.1.2/gcc/Case-Ranges.html

von Karl H. (kbuchegg)


Lesenswert?

In diesem Fall liegt der Schlüssel für einen einfacheren Code in der 
Erkenntnis, dass die Vergleichswerte alle Vielfache von 15 sind. In 
solchen Fällen geht mit ein bischen Rumrechnerei auf Grundschulniveau 
immer was (wurde ja schon gezeigt)

Wer die Division scheut, kann auch so vorgehen
1
  while( count > 30 )
2
    count -= 30;
3
4
  if( count <= 15 )
5
    button2 = 0x02;
6
  else
7
    button2 = 0x00;

: Bearbeitet durch User
von oldmax (Gast)


Lesenswert?

Hi
Wie wär es mit
Button2 =((Trunc(Count/15) And $01)-1)*-1*2
Kann es leider grad nicht ausprobieren aber das Ergebnis von Count / 15 
ist entweder Grade oder ungerade, d. H. Bit 0 ist bei Ungerade gesetzt. 
Das Ergebnios von And 01 ist also 0 oder 1 und das mal 2 ist entweder 0 
oder 2. Da aber bei Werten <15 in Button 2 soll, einfach vom Ergebnis 
Trunc(Count/15) And $01) 1 abziehen und anschließend aus -1 +1 machen..
Einfach mal probieren. Es gibt Compiler, die können das. C kenne ich 
allerdings nicht und zur Zeit hab ich noch nicht mal VB zur Verfügung.
Gruß oldmax

von Peter II (Gast)


Lesenswert?

oldmax schrieb:
> C kenne ich
> allerdings nicht und zur Zeit hab ich noch nicht mal VB zur Verfügung.

die C Lösung steht schon weiter oben.

von Patrick (Gast)


Lesenswert?

Micha schrieb:
> Hm, ich glaube der GCC kann das auch in C (als specifische Erweiterung)

Ja - mit dem Nachteil, dass der Code dann eben nicht mehr "generisch" 
bzw. übertragbar ist - was bei Mikrocontroller-Code ja ohnehin eher 
selten der Fall ist, daher spricht hier wohl nichts dagegen, diese 
Erweiterung zu verwenden.

Warum jedoch nicht einfach:
1
if(count <= 15
2
  || (count > 30 && count <= 45)
3
  || (count > 60 && count <= 75)
4
  || (count > 90 && count <= 105))
5
{
6
  button2 = 0x02;
7
}
8
else
9
{
10
  button2 = 0x00;
11
}

Oder sequentiell:
1
button2 = 0x00;
2
if(count <= 15)
3
{
4
  button2 = 0x02;
5
}
6
if(count > 30 && count <= 45)
7
{
8
  button2 = 0x02;
9
}
10
if(count > 60 && count <= 75)
11
{
12
  button2 = 0x02;
13
}
14
if(count > 90 && count <= 105)
15
{
16
  button2 = 0x02;
17
}

: Bearbeitet durch User
von Tom (Gast)


Lesenswert?

Timo schrieb:
> Code langsam total unübersichtlich
Schritt 1: Mit einen Kommentar beschreiben, was der lange Teil tut:
1
// decode count-dings to button-dings. 
2
if(count <= 15)
3
....

Schritt 2:  Den langen Teil in eine eigene Funktion auslagern, die so 
heißt wie der eben geschriebene Kommentar:
1
uint8_t decode_count_to_button(uint8_t x)
2
{
3
    switch(x)
4
    {
5
        case  0...15: return 0x02;
6
        case 16...15: return 0x00;
7
        // oder rechnen
8
    }
9
}
10
...
11
...
12
...
13
//decode_count_to_button
14
button2 = decode_count_to_button(count);
Schon ist der Code an der ursprünglichen Stelle lesbar und der Kommentar 
überflüssig, da im Code fast wörtlich wiederholt => weg mit dem 
Kommentar.


Uwe S. schrieb:
1
#define COMP(arg, statement) \
Sehr intuitiv und ohne nachlesen der Definition von COMP verständlich. 
Eine selbstzusammen#definete Programmiersprache ist immer gut, C kann 
einfach zu wenig.

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.