Forum: Compiler & IDEs const struct case


von ch (Gast)


Lesenswert?

Wie kann man eine Struktur als Konstante in "case" verwenden?
1
typedef struct
2
{
3
  uint8_t a;
4
  uint8_t b; 
5
} reg_t;
6
7
const reg_t BB={1,2};
8
9
case BB.a:
10
{
11
...

Ergibt in Visual Studio folgenden Fehler:

error C2051: case-Ausdruck ist keine Konstante

von Karl H. (kbuchegg)


Lesenswert?

ch schrieb:
> Wie kann man eine Struktur als Konstante in "case" verwenden?

So wie du dir das vorstellst: gar nicht

Auch wenn man die Dinger als 'Konstante' bezeichnet, betrachtet sie die 
Sprache und damit der Compiler als Variablen, die so vereinbart sind, 
dass man per Programm ihren Wert nicht ändern darf.

Das reicht aber nicht für einen case. Da muss tatsächlich eine 
Compile-Time Konstante stehen.

-> auf ein if ausweichen

von ch (Gast)


Lesenswert?

> -> auf ein if ausweichen

vielen Dank.

Ich hatte schon überlegt, statt der "struct" zwei "defines" zu 
verwenden.
1
#define BB_a 1
2
#define BB_b 2

aber ich will auch die Struktur als einzelner Parameter einer Funktion 
übergeben können.

Am Ende sind die "if's" wohl am besten.

von Matthias L. (Gast)


Lesenswert?

>aber ich will auch die Struktur als einzelner Parameter einer Funktion
>übergeben können.

Wenn ein define geht, dann bleibe dabei. Das ist eine Kosntante. Besser 
als jede Variable.

von Markus (Gast)


Lesenswert?

Hallo,

ist wahrscheinlich eine blöde Frage, aber wozu ist die Abfrage überhaupt 
gut, wenn das Argument eh konstant ist?

von Hans-Georg L. (h-g-l)


Lesenswert?

Nimm C++ und enum

typedef enum
{
  a =1,
  b =2
} my_type_t;

void funct(my_type_t value)
{
  switch (value)
  {
      case a :
    break;
      case b :
    break;
  };
}


int main()
{

  funct(a);


  return 0;
}

: Bearbeitet durch User
von ch (Gast)


Lesenswert?

>ist wahrscheinlich eine blöde Frage, aber wozu ist die Abfrage überhaupt
>gut, wenn das Argument eh konstant ist?

Vielleicht war der Code auch etwas missverständlich, weil ich die 
switch-Anweisung weggelassen habe
1
typedef struct
2
{
3
  uint8_t a;
4
  uint8_t b; 
5
} reg_t;
6
7
const reg_t BB={1,2};
8
const reg_t CC={2,2};
9
10
11
void test(uint8_t val)
12
{
13
 switch(val)
14
   case BB.a:
15
   {
16
    ...
17
18
   case CC.a:
19
   {
20
   ....

von Eric B. (beric)


Lesenswert?

Hans-Georg Lehnard schrieb:
> Nimm C++ und enum

Wieso C++? Das geht genau so auch in C! o_O

von Markus (Gast)


Lesenswert?

ch schrieb:
>>ist wahrscheinlich eine blöde Frage, aber wozu ist die Abfrage überhaupt
>>gut, wenn das Argument eh konstant ist?
>
> Vielleicht war der Code auch etwas missverständlich, weil ich die
> switch-Anweisung weggelassen habe

Ach so, jetzt hab ich's auch kapiert. Danke

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.