Unterschied: IF und SWITCH Abfrage

Gast #1530620
Lesenswert?

Hab da wieder ein kleines Problem mit meinem Compiler oder ich bin 
einfach zu dumm. Im Grunde dürften doch beide Abfragen das selber 
bewirken, das bei der Abfrage der Var "display" die jeweilige Function 
aufgerufen wird:
1
     switch (display) {
2
           case 1 : display_1(); break;
3
           case 2 : display_2(); break;
4
           case 3 : display_3(); break;
5
           case 4 : display_4(); break;
6
           case 5 : display_5(); break;
7
     }

und diese Abfrage:
1
    
2
     if (display == 1) display_1();
3
     if (display == 2) display_2();
4
     if (display == 3) display_3();
5
     if (display == 4) display_4();
6
     if (display == 5) display_5();

Jedoch wird entweder die Switchanweisung ignoriert oder der break kommt 
falsch. Wenn break weg bleibt, dann rennt er die switchanweisung 
logischerweise durch. Mit break bleibt sie stehen und das display bleibt 
dunkel.

Sollte ich das break in die function (display_x()) integrieren?!
#1530631
Lesenswert?

Die beiden Codefragmente bewirken nicht das Gleiche:

Bei deinem switch wird immer nur ein case angesprungen und bis zum 
nächsten break oder return abgearbeitet. Das break kannst du NICHT in 
die display_x() Funktionen ziehen.

Die if Anweisungen werden hintereinander geprüft. Sollte display seinen 
Wert in einer der display_x() Funktionen ändern, so kann auch noch ein 
anderer der Zweige ausgeführt werden.

Sollte display sich nicht verändern innerhalb der Funktionen, dann ist - 
bis auf den overhead des wiederholten Vergleiches - das Resultat beider 
Codeschnipsel identisch.
Gast #1530638
Lesenswert?

Äquivalent wären:
>
1
>      switch (display) {
2
>            case 1 : display_1(); break;
3
>            case 2 : display_2(); break;
4
>            case 3 : display_3(); break;
5
>            case 4 : display_4(); break;
6
>            case 5 : display_5(); break;
7
>      }
8
>

und

>
1
>      if (display == 1) display_1();
2
>      else if (display == 2) display_2();
3
>      else if (display == 3) display_3();
4
>      else if (display == 4) display_4();
5
>      else if (display == 5) display_5();
6
>
Gast #1530641
Lesenswert?

ich kann mich Tim Seidel nur anschließen. Sofern sich der Wert von 
"Display" während der Laufzeit nicht ändert sollte in beiden Fällen das 
gleiche passieren.

Erläutere bitte deine Aussage:
>Jedoch wird entweder die Switchanweisung ignoriert oder der break kommt
>falsch.
Gast #1530671
Lesenswert?

Gut gut, aber erschlagt mich nicht wegen dem Nudelcode :D Ich versuche 
ja mein bestes zu geben, und irgendwann klappt das schon noch g

Da ist übrigens auch gerade mein zweites Problem (Display_4, Calc_Sp) Da 
soll die Spannung berechnet werden, jedoch schaffe ich es nur bis dato 
Ganzzahlwerte zu bekommen. Brauch aber 2 Nachkommastellen :/
Angehängte Dateien:
Gast #1530683
Lesenswert?

also die Variable display wird in den einzelnen Funktionen schonmal 
nicht verändert. Damit sind deine beiden Code-Varianten eigentlich 
identisch.

was bei einem case statement immer gut kommt zum debuggen, ist ein 
default label, welches sich irgendwie bemerkbar macht, damit zu sieht 
dass was schief gelaufen ist.

Welchen Compiler benutzt du eigentlich? GCC scheints nicht zu sein.
Gast #1530688
Lesenswert?

Ich hätte als Compiler aber auch keine Skrupel, den folgenden Codeblock 
nicht zu übersetzen:
1
     if (richtung == 1 && temp_select <= 1) {
2
                  display++;
3
                  if(display == 6) display = 1;
4
                  delay_ms(50);
5
                  richtung = 0;
6
     }
7
     if (richtung == 2 && temp_select <= 1) {
8
                  display--;
9
                  if(display == 0 ) display = 5;
10
                  richtung = 0;
11
     }

'richtung' wird bei Programmstart auf 0 gesetzt und im 
Hauptprogrammfluss nie wieder verändert, also werden die Bedingungen der 
beiden if niemals wahr. Daher können sie bedenkenlos ausgelassen werden.
Gast #1530742
Lesenswert?

Sven P. schrieb:
> 'richtung' wird bei Programmstart auf 0 gesetzt und im
> Hauptprogrammfluss nie wieder verändert, also werden die Bedingungen der
> beiden if niemals wahr. Daher können sie bedenkenlos ausgelassen werden.

Ähm doch, oben im Interrupt. Bei Betätigung des Drehgebers wird die 
jeweilige Richtung (2 links, 1 rechts) in diese Variable gegeben. Damit 
bestimme ich ja auch was nun in der IF oder Switch Abfrage wahr ist.

Peter Dannegger schrieb:
> Die Funktion Button() ist nirgendwo definiert.

Braucht es bei MicroC nicht, ist dort in der Standartbibliothek 
definiert.

Peter Dannegger schrieb:
> in einem Interrupt, kräuseln sich jedem Programmierer die Fußnägel.

Ich weiß, ich weiß. Gut die 300 ms bei dem Knopf sind eigentlich 
unnötig. Jedoch komme ich bei den 100 ms des Drehgebers nicht drumrum. 
:/
#1530748
Lesenswert?

Draco schrieb:
> Sven P. schrieb:
>> 'richtung' wird bei Programmstart auf 0 gesetzt und im
>> Hauptprogrammfluss nie wieder verändert, also werden die Bedingungen der
>> beiden if niemals wahr. Daher können sie bedenkenlos ausgelassen werden.
>
> Ähm doch, oben im Interrupt.

Dann informiere dich mal über die Bedeutung von "volatile".

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