Zusammenfassen/Vereinfachen von if-Abfragen

Gast #3635849
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......
#3635892
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;
Gast #3635901
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
Gast #3635904
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
}
Gast #3635949
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.

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