Forum: Compiler & IDEs if, else if und else Frage


von Rolf (Gast)


Lesenswert?

Hallo,

könnte mir jemand mal erklären, worin hier der Unterschied besteht?
Ich dachte immer wie folgt:
if-Anweisung: wenn erfüllt, ok verlassen, wenn nicht --> else if 
-Anweisung, wenn erfüllt ok verlassen, wenn nicht erfüllt (weitere else 
if oder) else-Anweisung.
Nun wird aber der else if Zweig hier anscheinend niemals ausgeführt.
Gedacht war, dass das Programm in einem Timer Interrupt läuft und 
zyklisch einen Wert abfrägt, ob dieser sich geändert hat.
zaehler soll solange hochzählen, bis er bei 50 ist und dann prüfen. Wenn 
der Zähler=0 ist, soll der Wert als Sicherung für den späteren Vergleich 
kopiert werden.
Folgender Code geht nicht:
1
            
2
    if (zaehler1 == 0){            // Wenn der Zählerstand bei 0 ist
3
    Wertkopie = Wert;
4
    }
5
    else if (zaehler1 >= 50){        
6
      if ( WertKopie == Wert ){ // hat sich der Wert nicht geändert
7
        Wert = 65535;    // Rücksetzen
8
        zaehler1 = 0;          // Zaehlvariable zurücksetzen
9
      }
10
      else{                // Der Wert hat sich geändert
11
        zaehler1 = 0;          // Zaehlvariable zurücksetzen
12
      }
13
    }
14
    else{                  // zaehler1 ist weder 0 noch größer gleich 50 und wird weiter erhöht
15
      zaehler1++;              // zaehler1 weiter erhöhen
16
    }

und folgendes geht:
1
        
2
    if (zaehler1 == 0){            // Wenn der Zählerstand bei 0 ist
3
    Wertkopie = Wert;
4
    }
5
    if (zaehler1 >= 50){        
6
      if ( WertKopie == Wert ){ // hat sich der Wert nicht geänder
7
        Wert = 65535;    // Rücksetzen
8
        zaehler1 = 0;          // Zaehlvariable zurücksetzen
9
      }
10
      else{                // Der Wert hat sich geändert
11
        zaehler1 = 0;          // Zaehlvariable zurücksetzen
12
      }
13
    }
14
    else{                  // zaehler1 ist weder 0 noch größer gleich 50 und wird weiter erhöht
15
      zaehler1++;              // zaehler1 weiter erhöhen
16
    }

Danke.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

FAQ #1: volatile vergessen?

von Mano W. (Firma: ---) (manow)


Lesenswert?

geh deine Codeausschnitte mal mit Startwert von zaehler = 0 ein paar mal 
durch.

Wieso bleibt denn beim ersten zaehler immer gleich 0 und beim zweiten 
nicht?

von Karl H. (kbuchegg)


Lesenswert?

In deiner ersten Version stellt sich die Frage:

Wenn zaehler1 tatsächlich 0 ist, wie kommt er dann emals zu einem Wert 
ungleich 0. In der gezeigten if - else if - Leiste gibt es dafür keine 
Möglichkeit. zaehler1 wird immer auf 0 bleiben. Spiels einfach mal durch 
für einen Wert von 0 in zaehler1

Deine zweite Lösung vermeidet dieses Problem, indem der Fall "größer 50" 
vom Fall "gleich 0" entkoppelt wird. Hat zaehler1 den Wert 0, dann ist 
das nicht größer 50 und folglich kommt der else Zweig von der 50-er 
ABfrage zum Zug, in der zaehler1 um 1 erhöht wird.
Dafür ist allerdings dieser Kommentar
1
    else{                  // zaehler1 ist weder 0 noch größer gleich 50 und wird weiter erhöht
schlicht und ergreifend falsch. Dieses else wird auch dann ausgeführt, 
wenn zaehler1 gleich 0 ist.


Du hast dich mit der Logik selbst ausgetrickst

von Rolf (Gast)


Lesenswert?

Karl heinz Buchegger schrieb:
> Du hast dich mit der Logik selbst ausgetrickst

Schande auf mein Haupt, in der Tat. Als Startwert hatte natürlich der 
Zähler auch den Wert 0, sodass er sich nie verändert hatte.

Danke

von Karl H. (kbuchegg)


Lesenswert?

Ich würds so schreiben. Dann ist alles klar und es gibt keine 
Unklarheiten
1
    if (zaehler1 == 0){
2
      Wertkopie = Wert;
3
    }
4
5
    zaehler1++;
6
7
    if (zaehler1 >= 50){        
8
      zaehler1 = 0;
9
10
      if ( WertKopie == Wert ){ // hat sich der Wert nicht geändert
11
        Wert = 65535;           // Rücksetzen
12
      }
13
    }

Das trennt die Erkennung des Startwertes ganz klar von der Erkennung des 
Endwertes und zeigt auch das zaehler1 laufend erhöht werden soll.


Da ist auch noch das generelle Prinzip zu erkennen, wie man eine 
Variable macht, die laufend reihum von 0 bis 49 zählt und so 50 Aufrufe 
abzählt
1
   cnt++;
2
   if( cnt >= 50 )
3
     cnt = 0;

Du willst davor noch etwas machen, nämlich dann wenn cnt gleich 0 ist
und du willst etwas machen, wenn der Ringelreihen einmal rum ist und der 
nächste Durchgang beginnt. Das eine fragst du vor der Erhöhung ab, weil 
es auch beim allerersten Starten gemacht werden muss, das andere nach 
der Erkennung des 'Overflows', weil das beim allerersten Aufruf eben 
nicht passieren darf.


Du hast ganz einfach in meinen Augen versucht zuviele (und vor allen 
Dingen zu unterschiedliche Dinge) in eine if-else Leiter zu quetschen.

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.