Forum: Compiler & IDEs Veränderliche Variable in Switch Anweisung?


von Tio T. (misterten)


Lesenswert?

Hallihallo,

ich habe so etwas wie
1
void test(void)
2
{   static unsigned char wert, offset;
3
4
    switch (wert)
5
    {   case 1: [..]
6
                break;
7
8
        case (1 + offset): [..]
9
                break;
10
    }
11
}

Leider bekomme ich dabei die Fehlermeldung
1
case label does not reduce to an integer constant
. 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

von Klaus F. (kfalser)


Lesenswert?

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.

von Stefan E. (sternst)


Lesenswert?

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.

von Tio T. (misterten)


Lesenswert?

Schade, hatte ich schon befürchtet. Naja, wollte mal sicher gegangen 
sein. Danke!!! :-)

von Tio T. (misterten)


Lesenswert?

@Stefan: Achsoo... Okay, werde wie gesagt meinen großen Switch Absatz 
umschreiben müssen... heul Aber macht ja Spaß sowas. :D

von Ralf (Gast)


Lesenswert?

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;

}

von Matthias L. (Gast)


Lesenswert?

1
case 1:
2
3
case (1 + offset):


Wie unterscheidest du zwischen den beiden CASE, wenn offset=0 ist ?

von Ralf (Gast)


Lesenswert?

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.

von Klaus W. (mfgkw)


Lesenswert?

je nachdem, welche Werte vorkommen, hilft vielleicht eine
Krücke dieser Art:
1
void test(void)
2
{   static unsigned char wert, offset;
3
4
    // für die festen Werte:
5
    switch (wert)
6
    {   case 1: [..]
7
                break;
8
        // ...
9
    }
10
    // für die restlichen:
11
    switch (wert-offset)
12
    {   case 1: [..] // wert == 1 + offset
13
                break;
14
        // ...
15
    }
16
}

von Tio T. (misterten)


Lesenswert?

Ja, sieht gut aus. Oder, was mir auch noch einfällt:

1
void test(void)
2
{   static unsigned char wert, offset;
3
4
    switch (wert)
5
    {   case 1: //..
6
                break;
7
8
        case 2: switch (offset)
9
                {   case 1: //..
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.

von Karl H. (kbuchegg)


Lesenswert?

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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.