Hallo,
Ich möchte bei einer case- Anweisung von 0-26 abfragen, geht das
überhaupt mit switch case und wie wenn ja?
switch(x) {
case 0...26: break;
case: break;
case: break;
}
Vielen Dank für Eure Hilfe;
lg
Hannes
wie wäre es mit if (x >= 0 && x < 27) ich meine bei switch case geht das nur bei einem wert, also case 1 case 'X' oder so
switch(x)
{
case 0:
case 1:
...
case 26: tu_was;
break;
case 27: tu_was_anderes;
break;
...
default: tu_gar_nix;
break;
}
MW
> wie wäre es mit if (x >= 0 && x < 27)
Ja genau, warum kompliziert wenns auch einfach geht...
Naja wenn man aus der PASCAL-Ecke kommt, kann man den Wunsch schon verstehen. Da ist iirc ein
1 | case x of 0..26: |
möglich.
Ich weiß nicht, wie clever die einzelnen Compiler sind, aber Michaels
Lösung würde wohl meist in eine uneffektive Abfrageorgie übersetzt
werden. Das ist nix.
Bastis "Lösung" ist hier vermutlich zu unübersichtlich, sonst wäre ja
nicht nach switch gefragt. Wenn man einen Haufen Einzelwerte hat, aber
auch ein Grüppchen, macht man das nicht mit einem Berg else if, sondern
packt den Bereich ins default:
switch(x) {
case 42: dings(); break;
case 99: bums(); break;
case 111: bla(); break;
default:
if (x >= 0 && x <= 26)
foo();
else
bar();
break;
}
Sollte m.E. flott und dabei zumutbar übersichtlich sein.
Basti: if (x >= 0 && x < 27)... Philipp Sªsse: if (x >= 0 && x <= 26)... Wo ist der Unterschied??
kein problem, aber eher unschön:
switch (käsekuppe)
{
case 0:
case 1:
case 2:
case 3:
case 4:
case 5:
case 6:
[...]
case 24:
case 25:
case 26:
anweisung();
break;
case 27:
break;
default:
break;
}
wenn du die "break's" weglässt, rennt er durch bis zum ersten "break".
pumpkin
das dürfte dann aber wirklich in 26 Einzelvergleiche hinauslaufen, logisch zwar korrekt, aber laufzeitmässig ziemlich mangelhaft...
>> Wo ist der Unterschied?? > das drumrum, sonst nix mmmh, mal wieder eine gefährliche aussage. kommt auf deine datentypen an. bei integer ist da kein unterschied, aber bei gebrochenen zahlen (float, etc) ist der unterschied gewaltig (und selbsterklärend). pumpkin
> das dürfte dann aber wirklich in 26 Einzelvergleiche hinauslaufen, > logisch zwar korrekt, aber laufzeitmässig ziemlich mangelhaft... danke für den hinweis. "kein problem, aber eher unschön:" pumpkin
> das dürfte dann aber wirklich in 26 Einzelvergleiche hinauslaufen, > logisch zwar korrekt, aber laufzeitmässig ziemlich mangelhaft... Unterschätzt den Compiler nicht. Was switch-statements angeht sind die recht leistungsfähig, kennen diverse Varienten der Codegenerierung, rechnen ein bischen herum und suchen sich die passende aus. Da sind auch welche drunter, die man in Assembler-Programmierung kaum vernünftig hinbekommt, wie beispielsweise der recht häufig genutzte tree search (hier wohl nicht relevant). Lieber mal ausprobieren und nachsehen.
Das sehe ich wie A.K. Der Compiler macht es schon effektiv, egal wie unsortiert der Input sein mag. Die Lösung von Michael ist zwar länglich, aber klar und deutlich, ohne Gemurkse.
da steht "dürfte"...
Was der Compiler draus macht, kann man nicht vorhersehen, zumindest
nicht allgemeingültig. Da hilft nur nachschauen im listing.
Ich habs gerade mal mit CodeVision gemacht:
while (1)
{loop++;
switch (loop)
{case 0:
case 1:
case 2:
case 3:
case 4:
case 5:
case 6:
case 7:
case 8:
case 9:
case 10: {test();
break;
}
default: break;
}
000066 5f0f SUBI R16,-1
; 110 switch (loop)
000067 2fe0 MOV R30,R16
; 111 {case 0:
000068 30e0 CPI R30,0
000069 f011 BREQ _0xA
; 112 case 1:
00006a 30e1 CPI R30,LOW(0x1)
00006b f409 BRNE _0xB
_0xA:
; 113 case 2:
00006c c002 RJMP _0xC
_0xB:
00006d 30e2 CPI R30,LOW(0x2)
00006e f409 BRNE _0xD
_0xC:
; 114 case 3:
00006f c002 RJMP _0xE
_0xD:
000070 30e3 CPI R30,LOW(0x3)
000071 f409 BRNE _0xF
_0xE:
; 115 case 4:
000072 c002 RJMP _0x10
_0xF:
000073 30e4 CPI R30,LOW(0x4)
000074 f409 BRNE _0x11
_0x10:
; 116 case 5:
000075 c002 RJMP _0x12
_0x11:
000076 30e5 CPI R30,LOW(0x5)
000077 f409 BRNE _0x13
.
.
erkennt also die mögliche Vereinfachung nicht.
unser compiler für ppc`s bekommt das ganz gut auf die reihe, selbst für komplizierte "mischungen". um sicher zu gehen, lieber ein if konstrukt verwenden, wenn es bei einem oder 2 bereichen und vielen einzelabfragen bleibt, ist das nicht unübersichtlich, zudem ist man sicher das kein ellenlanger asm code produziert wird, egal welchen compiler man nutzt. d. ps.: da ist sie man wieder, die harwareunabhängigkeit von c, die alle in den wahnsinn treibt...
wie wäre es dennn mit dem hier:
if (x >= 0 && x < 27) case 0..27
{
...
}
else if( x >= 27 && x < 30 ) case 27..20
{
...
}
else if( x >= 30 && x < 35 )case 30..35
{
...
}
usw...
else default
if (x >= 0 && x < 27) case 0..27
{
...
}
else if( x < 30 ) case 27..20
{
...
}
else if( x < 35 )case 30..35
{
...
}
du meinst wohl so...
nachteil:
verschachtelung, wie bei allen if else Konstrukten...
d.
@crazy horse:
while (1) {
loop++;
switch (loop) {
case 0:
case 1:
case 2:
case 3:
case 4:
case 5:
case 6:
case 7:
case 8:
case 9:
case 10:
test();
break;
default:
break;
}
}
wird bei GCC (-Os) zu
.L20:
adiw r28,1
cpi r28,11
cpc r29,__zero_reg__
brsh .L20
rcall test
rjmp .L20
Hi, kann man im Assembler einfach so wie in C die Switch Case Funktion einbauen?? oder muss das anders programmiert werden??
es gibt in Assembler nicht direkt sowas wie switch case, mann muss es also zu Fuß implementieren. Sollte aber machbar sein. Stefan.
dann vielleicht eher mit der vergleichsfkt. realisieren oder?? Also mit cmp Var, 4 Befehl ausführen cmp Var, 3 Befehl ausführen oder???
Oder, wenn viele der case-Fälle direkt nebeneinander liegen, mit einer Sprungtabelle, also über den Wert indirekt die Sprungtabelle laden.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.