Veränderliche Variable in Switch Anweisung?

OP #1487336
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
Gast #1487357
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;

}
Gast #1487416
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.
#1487421
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
}
OP #1488060
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.
#1488117
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren