switch-Anweisung mit Werten aus Array
-
Ich möchte mittels switch eine Variable mit Werten aus einem Array vergleichen, jedoch klappt dies nicht, da der Compiler konstante Werte erwartet.
Meine Anweisung sieht wie folgt aus:
const int Werte[3] = {3,1,2}; int x = rand()%2; x++; switch (x) { case Werte[0]: // case Werte[1]: // case Werte[2]: // }
Wenn ich es so abwandle, dass ich anstelle eines Arrays drei einzelne const int Werte verwende, compiliert das ganze ohne Probleme.
Hab ich bei der Deklaration des Arrays noch etwas vergessen?
-
Nein ein switch kannst du nur mit konstanten Werten benutzen!
Also benutzt du es mit dem Array falsch.Hier vielleicht mal etwas zum nachlesen:
-
Also sind Werte in einem Array nicht constant, wenn ich es mit "const int" initialisiere?
-
GR-Thunderstorm schrieb:
Also sind Werte in einem Array nicht constant, wenn ich es mit "const int" initialisiere?
Nein
Das const ist eher für dich selbst, um dich vor eigenen Fehlern zu schützen. Der Compiler kann dadurch praktisch gar nichts optimieren (außer er kann beweisen, dass sich ein Wert nicht ändert, aber dazu braucht dieser Wert nicht const-qualifiziert zu sein) und als Compilezeitkonstante gilt so etwas erst recht nicht.
Demo:const int foo[] = {1,2,3}; *((int*) foo) = 5; printf("%d\n", foo[0]);
edit2: In C++ gilt das übrigens nicht, da gibt es echte Compilezeitkonstanten.
-
case Argumente müssen konstante Ausdrücke sein, also zur Compilezeit bekannt.
wobei lfind/search.h nicht ANSI C ist, aber viele gängige Compiler kennen dies.
Bereichsangaben für case (z.B. 1..100) wird als compilerspezifische Erweiterung z.B. vom gcc angeboten.
-
GR-Thunderstorm schrieb:
Ich möchte mittels switch eine Variable mit Werten aus einem Array vergleichen, jedoch klappt dies nicht, da der Compiler konstante Werte erwartet.
Geht also nicht. Aber quasi den gleichen Effekt hat eine Tabelle im Speicher, die für jeden möglichen Wert angibt, wo es weiter geht. Lies mal hier:
http://en.wikipedia.org/wiki/Branch_table