Zustand in Switch
-
Hallo,
ich habe ien Problem mit einer Zustandsänderung eines Handscanners.
void main(void) { int current_state = 0; int previous_state = -1; while(1) { current_state = ischarging(); if(current_state != previous_state) { previous_state = current_state; switch(current_state) { case 0: printf("\f"); printf("Status:\nBereit"); setfont(MEDIUM_FONT,0); printf("Zum Scannen mittlere Taste druecken!"); setfont(LARGE_FONT,0); Steuerung(); //Hauptroutine break; case 1: printf("\f"); printf("Status:\nAngeschlossen und Ladend"); break; case 2: printf("\f"); printf("Status:\nAngeschlossen"); break; } } idle(); } }
Nachdem ich am Anfang in case 0 war und meine Hauptfunktion Steuerung(); aufgerufen habe und wieder in main zurückkehre, soll der gleiche bzw. ein anderer Status angezeigt werden (zum Beispiel: wieder "Status: Bereit")!
Da haut doch irgendwas mit der switch nicht hin.
Gruß und Danke im Voraus.
-
du hast den switch ja auch in einem "if(current_state!=previous_state)" eingepackt, d.h. wenn sich seit dem letzten Schleifendurchlauf der Status nicht geändert hat, wird dein Programm auch nicht in den switch reinspringen.
-
Ausserdem empfehle ich dringend eine default-Anweisung mit Fehlerbehandlung zu implementieren!
-
Sicherlich liegts an der if- Bedingung.
Aber wie kann ich das ändern?
Wenn ich die Bedingung rausnehme, geht er unendlich mal in die case 1 bzw. case 2.
-
Offensichtlich muss Steuerung von der üblichen Statusausgabe getrennt aufgerufen werden....?
-
du mußt die zeile
previous_state = current_state;
hinter den körper der if-anweisung setzen:
if(current_state != previous_state) { ... } previous_state = current_state;
-
Konfusius schrieb:
du mußt die zeile hinter den körper der if-anweisung setzen:
Das bewirkt gar nichts. Im if-Block wird previous_state (außer in der Zuweisung) nicht benutzt, und die Zuweisung tut nichts, wenn die Bedingung nicht wahr ist.
@fevernova: Setze previous_state am Ende des case 0-Blocks auf einen von 0 verschiedenen Wert. Oder ändere die if-Bedingung so, dass der Block betreten wird, wenn current_state und previous_state unterschiedlich sind ODER current_state 0 ist.
-
Klappt einwandfrei mit dem Vorschlag von MFK.
Vielen Dank.