Veränderliche Variable in Switch Anweisung?

OP #1487336
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
#1487341
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.
#1487342
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.
Gast #1487357
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
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
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
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
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

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.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.