. Ich würde es ja verstehen, wenn meine Variable auch eine Konstante
wäre, ist sie aber nicht. Habe auch schon versucht, diese global zu
deklarieren, hat aber die gleiche Fehlermeldung gebracht.
Kann ich das nur mit einer If Abfrage lösen? Oder wie kann ich das doch
noch mit der switch Anweisung klären? Ist mir übersichtlicher und
sicherer, habe schon 10 Switch-Werte...
Grüße
case (1 + offset): [..]
ist die Zeile mit dem Problem.
Die Fehlermeldung sagt es schon: der angegebene Wert nach dem case muss
eine Konstante sein.
Wenn deine Vergleichewerte wirklich veränderlich sind, dann mußt Du es
mit einer if..else Kette lösen.
Tio T. schrieb:
> Ich würde es ja verstehen, wenn> meine Variable auch eine Konstante wäre, ist sie aber nicht.
Hä? Es ist doch genau das Problem, dass es keine Konstante ist. Ein
case-Label muss eine Compiletime-Konstante sein.
Hallo,
man kann natürlich innerhalb des Switch-Kontext eine Default Anweisung
angeben und innerhalb der Default-Anweisung eine if then else Abfrage
platzieren.
switch {wert}
{
case 1:
break;
case 2:
break;
default:
if(...){
}else{
(...)
}
break;
}
Hier geht es ja unter anderem auch darum die Übersichtlichkeit zu
bewahren.
Dies kann man dadurch erreichen, dass der berechnete Teil in der
Default-Anweisung steht. Es ist darauf zu achten, dass es keine
Überschneidung bei den Defaultwerten zu den berechneten Werten gibt,
dies sollte man im Vorfeld sicherstellen. Wenn es trotzdem zu einer
Überschneidung kommt, haben die definierten Werte Priorität.
Ja, sieht gut aus. Oder, was mir auch noch einfällt:
1
voidtest(void)
2
{staticunsignedcharwert,offset;
3
4
switch(wert)
5
{case1://..
6
break;
7
8
case2:switch(offset)
9
{case1://..
10
break;
11
}
12
break;
13
}
14
}
Hintergrund des Ganzen: Der Wert Offset spielt nur genau dann eine
Rolle, wenn der Wert einen einzigen, bestimmten Wert hat. Daher würde
ich das nicht in den Default-Zweig unterbringen wollen.
@Matthias: Du hast Recht. Wenn Offset denn dann Null wäre hätte die
Switch Anweisung einen doppelten Fall, was nicht zulässig ist. Ich hatte
gehofft, den Compiler dahin gehend auszutricksen, als dass ich im
vorangehenden Code schon dafür gesorgt hätte, dass Offset nie Null
werden kann.
Tio T. schrieb:
> @Matthias: Du hast Recht. Wenn Offset denn dann Null wäre hätte die> Switch Anweisung einen doppelten Fall, was nicht zulässig ist. Ich hatte> gehofft, den Compiler dahin gehend auszutricksen, als dass ich im> vorangehenden Code schon dafür gesorgt hätte, dass Offset nie Null> werden kann.
Was Matthias meinte war die Begründung, warum die Sprache fordert, dass
es sich um Konstante handeln muss und diese eindeutig sein müssen.
Das du dafür sorgst, dass dieser 'Doppelfall' nicht auftreten kann ist
zwar löblich, aber der Compiler kann das nicht überprüfen. Der macht ja
keine Auswertung welche Logik du fabriziert hast.
Eine eigene Frage?
Dieser Thread ist über 16 Jahre alt.
Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.