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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.