[C++] Verständnisfrage zu Switch / if

the incredible Leitman

Erfahrenes Mitglied
hm... bin ich fett?
kann mir einer sagen, warum das:

Code:
if (sender == newControlControl1->buttonL)
{
	this->newControlControl1->StatusFlank = newControl::newControlControl::FlankStatus::StatusLeft;
}	 
if (sender == newControlControl1->buttonM)
{	
	 this->newControlControl1->StatusFlank = newControl::newControlControl::FlankStatus::StatusMiddle;
}
if (sender == newControlControl1->buttonR)
{
	 this->newControlControl1->StatusFlank = newControl::newControlControl::FlankStatus::StatusRight;
}

einwandfrei funktioniert und das:

Code:
switch(sender)
{
	 case newControlControl1->buttonL:
		 this->newControlControl1->StatusFlank = newControl::newControlControl::FlankStatus::StatusLeft;
		 break;
	 case newControlControl1->buttonM:
		 this->newControlControl1->StatusFlank = newControl::newControlControl::FlankStatus::StatusMiddle;
		 break;
	 case newControlControl1->buttonR:
		 this->newControlControl1->StatusFlank = newControl::newControlControl::FlankStatus::StatusRight;
		 break;
}
nicht?

bekomme Meldungen wie:
error C2450: switch expression of type 'System::Object ^' is illegal
und
case expression not constant

Was kann da los sein?
(MVStudio 2005, VC++)
 
Hi.

Im Grunde hat der Compiler doch schon alles verraten. In C/C++ darf in einem switch Ausdruck nur ein integraler Wert (int, char, short) stehen, keine Variable vom Typ Object^.

Außerdem dürfen in C/C++ in den case Bedingungen nur Konstante Werte (char-Literale, int-Literale oder Konstanten) stehen; deine Werte sind offenbar nicht konstant.

Offensichtlich ist das in der Abart von C++ die du da benutzt auch so.

Gruß
 
leitman hat gesagt.:
Danke, d.h. ich kann das in dem Fall gar nicht mit einem switch lösen?

Nein alles, was du zur Optimiereung noch machen könntest ist, else if anstelle von if zu nutzen

also

C++:
if(...)
 ...
else if(...)
 ...
else if(...)
 ...

Das ist auch nicht langsamer als ein switch
 
Hallo zusammen :)

gut, das wär geklärt...aaaaaaaaber
ich hab da noch ein Problem!

Habe eine Switch Anweisung, die den Status eines Controls abfragt und je nachdem, was für einen Wert das Steuerelement hat, sollen bestimmte Methoden ausgeführt werden.

Kann ich nun in einem case eine Methode ausführen und anschließend einen anderen Fall starten? geht das?

So funktioniert es nicht:
Code:
case ZLSControls::ZLSControlBaseClass::State::State5:  // case 2 locked

// Lock 
formGraphics->FillPolygon(brush, points);
formGraphics->FillRectangle(brush, 0, 5*this->Height/8, this->Width,this->Height/4);
formGraphics->FillRectangle(brush, 0, this->Height/8, this->Width/4,this->Height/4);

DrawLock();

case 2:;

error C2196: case value '2' already used

Hab mir überlegt, das break wegzulassen und darunter case 2 auszuführen, aber dann kommt nicht das raus, was ich eigentlich möchte.

Also...Kann ich in einer Case Verzweigung zu einer anderen Case Verzweigung springen?
Wenn ja, wie geht dem?

pls help!

Danke Vielmals
mfG

Leitman
 
Hi.

Das könntest du höchstens mit einem goto machen.
C++:
switch (x) {
  case2:
  case 2:
    ...
    break;
  case 5:
    goto case2;
}

Gruß
 
deepthroat hat gesagt.:
Hi.

Das könntest du höchstens mit einem goto machen.

Könnte ich probieren
hmm... goto... Aber mir wird seit ich mit C++ angefangen habe eingetrichtert,
"VERWENDE NIEMALS DEN GOTO BEFEHL, DER HAT IN EINER HÖHEREN PROGRAMMIERSPRACHE WIE C++ NICHTS VERLOREN" :suspekt:

Aber wenn es da keine andere Möglichkeit gibt, mach ich das halt so :D

Danke dir
greez
 
Bezüglich des case/switches ist ja schon die richte Antwort (es werden immer integrale Werte erwartet) gegeben,
Eventuell kannst Du aber den Sender auf den entsprechenden Typ casten
und somit den gegebenen Wert in einen integralen Wert überführen.
Ich nehme an, es handelt sich um irgendein Mausobject, welches die Eigenschaft hat anzugeben welcher Button gedrückt ist.

nSwitch = dynamic_cast<TMouse*>(Sender)->Status;

Dann könntest Du folgendes schreiben
switch(nSwitch )
{
case StatusLeft:
this->newControlControl1->StatusFlank = newControl::newControlControl::FlankStatus::StatusLeft;
break;
case StatusRight:

usw.
Beachte bitte, dass TMouse und mbLeft nur angenommene Typen sind. D.h. dieses müsstest natürlich durch die richtigen Werte ersetzen.
Zu Geschwindigkeit:
If/else Anweisungen sind normalerweise immer schneller als switch/case Ausdrücke. (Falls das bei den heutigen Computer noch eine Rolle spielen sollte)
Als C++ Entwickler der offenbar unter .Net arbeitet solltest Du allerdings das goto scheuen wie der Teufel das Weihwasser.
Wenn Du offenbar den gleichen Code aufrufen möchtest der unter 2 abgearbeitet wird. Tue den Code in eine eigene Methode und rufe die eben nochmals auf. Sollte es sich nur ein, oder zwei Zeilen handeln, dann schreibe dieses eben nochmal

Gruß
Gerhard
 
Mit Goto() würde ich das nicht machen.
Du musst aber irgendwo ein break; anbringen...
Hast du schonmal versucht, in "case...::State5:" den Switch-Parameter auf 2 zu ändern.
Andernfalls kopier lieber die Methode von "case 2:.." in "case ...::State5:..." rein.

...Ups..zu spät..GABehnke hat vollkommen recht..nur etwas anders ausgedrückt.
 
Zuletzt bearbeitet:
wie wärs einfach mit
C++:
switch(n)
{
  case 5:
    //.....
    // kein break; !
  case 2:
     //....
     break;
}

dann wird wenn case 5 zutrifft danach noch alles aus case 2 ausgeführt
 
Zurück