PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : switch in Verbindung mit einer enum Variable



Whassup
23.08.2005, 08:59
Hallo,

folgendes Problem. In meinem Programm wird folgende Variable definiert
typedef enum {
NULL,
EINS,
ZWEI,
} Zahlenreihe;
volatile Zahlenreihe dummy;

Im Hauptprogramm wird wird nun der Variablen dummy der Wert NULL zugewiesen.
dummy = NULL;
Anschließend erfolgt eine Auswertung mit Hilfe von switch.

switch (dummy) {
case NULL:
case EINS:

x = 5;
case ZWEI:

y = 2;
}
Mein Problem ist nun, dass obwohl die Variable dummy immer noch den Wert NULL besitzt, dass Programm trotzdem in case EINS hineinspringt (und dann auch in den case ZWEI). Dies habe ich im AVRStudio mit Hilfe der Variablenüberwachung auch gesehen.
Habe ich da was bei dem switch-Befehl nicht richtig verstanden, oder bei enum?
Habt schon mal vielen Dank für eure Hilfe.
Gruß
Stefan

PicNick
23.08.2005, 09:04
Die feinen Leute schreiben da "break" dazwischen. Ohne dem fährt der C da glatt durch. (Is nicht wie bei Bascom)


switch (dummy)
{
case NULL:
break;
case EINS:
x = 5;
break;
case ZWEI:
y = 2;
break;
default:
break;
}

Thorsten
23.08.2005, 09:07
Du musst nach jedem case noch ein break einfügen also:



case foo:
blabla();
break;
case bar:
blabla2();
break;


ohne das break rattert er den ganzen case block ab.

edit: Mal wieder zu langsam :-)

Whassup
23.08.2005, 14:28
Hallo,

das ist ja alles richtig, aber er soll ja auch die weiteren cases überprüfen, ob einer wahr ist und dann hineinspringen. Mein Problem ist jetzt, dass obwohl dummy den Wert NULL besitzt, das Programm trotzdem in case EINS reinspringt und ich das nicht verstehe..

Nochmal vielen Dank

Gruß
Stefan

PicNick
23.08.2005, 14:38
Er springt ja nach NULL.
Aber mangels "break" marschiert er gleich weiter zu EINS und dann auch gleich noch zu ZWEI.
klaro ?

EDIT: da bei NULL nix gemacht wird, schaut es im Debugger aus, als wär er gleich zu EINS gesprungen. Du hast ja einen Optimizer auch noch.
Auf was sollte auch der Pfeil beim debugger hinzeigen ?

Whassup
23.08.2005, 14:46
Hi,
das ist richtig, aber warum führt er die Anweisung x=5 aus? Die steht doch im "case" EINS und sollte deshalb nicht ausgeführt werden..?

Gruß

Stefan

Thorsten
23.08.2005, 14:50
Weil das break fehlt. Ohne das Fängt er bei NULL an und arbeitet sich nach unten durch. Ohne Break werden ALLE Anweisungen nach dem Einsprungpunkt dis zum Blockende ( } ) ausgeführt.
Schreib deine Funktion mal so wie PicNick gepostet hat.

Hier kannst du es nochmal genau nachlesen:
http://www.pronix.de/pronix-686.html

mfg
Thorsten

Whassup
23.08.2005, 15:07
hi,
oh ja...alles klar.
Vielen dank

Gruß Stefan