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. 👍


Anmelden zum Antworten