mikrocontroller.net

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


Autor: Rolf (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
            
    if (zaehler1 == 0){            // Wenn der Zählerstand bei 0 ist
    Wertkopie = Wert;
    }
    else if (zaehler1 >= 50){        
      if ( WertKopie == Wert ){ // hat sich der Wert nicht geändert
        Wert = 65535;    // Rücksetzen
        zaehler1 = 0;          // Zaehlvariable zurücksetzen
      }
      else{                // Der Wert hat sich geändert
        zaehler1 = 0;          // Zaehlvariable zurücksetzen
      }
    }
    else{                  // zaehler1 ist weder 0 noch größer gleich 50 und wird weiter erhöht
      zaehler1++;              // zaehler1 weiter erhöhen
    }

und folgendes geht:
        
    if (zaehler1 == 0){            // Wenn der Zählerstand bei 0 ist
    Wertkopie = Wert;
    }
    if (zaehler1 >= 50){        
      if ( WertKopie == Wert ){ // hat sich der Wert nicht geänder
        Wert = 65535;    // Rücksetzen
        zaehler1 = 0;          // Zaehlvariable zurücksetzen
      }
      else{                // Der Wert hat sich geändert
        zaehler1 = 0;          // Zaehlvariable zurücksetzen
      }
    }
    else{                  // zaehler1 ist weder 0 noch größer gleich 50 und wird weiter erhöht
      zaehler1++;              // zaehler1 weiter erhöhen
    }

Danke.

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
FAQ #1: volatile vergessen?

Autor: Mano Wee (Firma: ---) (manow)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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
    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

Autor: Rolf (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich würds so schreiben. Dann ist alles klar und es gibt keine 
Unklarheiten
    if (zaehler1 == 0){
      Wertkopie = Wert;
    }

    zaehler1++;

    if (zaehler1 >= 50){        
      zaehler1 = 0;

      if ( WertKopie == Wert ){ // hat sich der Wert nicht geändert
        Wert = 65535;           // Rücksetzen
      }
    }

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
   cnt++;
   if( cnt >= 50 )
     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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.