![]() |
Case Frage
Nur mal ne grundlegende Frage zu Delphi
Warum haben es die Delphiprogrammierer in eienr case struktur ausgeschlossen das case aus nem string zu bilden? ich meine: das ist doch/ wäre dochmanchmal sehr praktisch. mfg Nicodius |
Re: Case Frage
Sie haben es nicht ausgeschlossen. Es ist nicht möglich, da case nur mit ordinal Werten arbeitet.
|
Re: Case Frage
Ich glaub er meint, warum case nur mit ordinaltypen arbeitet! Warum also Borland das so gebaut hat´?
|
Re: Case Frage
öhm so verständnishalber mal ne kleine Beschreibung, was "ordinal" bedeutet, dann is das eigentlich klar ;)
Zitat:
Stephan |
Re: Case Frage
genau
sorry wegen falscher formulierung :stupid: was ordinal heißt das weiß ich aber geerell würde eine casestruktur genauso gut mit strings funktionieren da ZEICHEN K E T T E N also mehrere chars das hätten die leicht einbauen können :stupid: |
Re: Case Frage
Liste der Anhänge anzeigen (Anzahl: 1)
case kann grundsätzlich nur konstante Ordinalwerte benutzen. Und der Grund wird klar, wenn man sich den erzeugten Code ansieht:
Delphi-Quellcode:
Das erzeugt den im Anhang gezeigten Code. Da sieht man sehr schön, wie raffiniert der Compiler vorgeht: Er schreibt zunächst unser i in das Register EAX. Dann zieht er 2 davon ab. Nun prüft er, ob EAX gleich 0 ist, was der Fall gewesen wäre, wenn i=2 wäre. Nun zieht er noch eins und prüft wieder auf 0 (entspricht case 3). Ist bis hierher immer noch kein Sprung erfolgt, kommt ein unbedingter Sprung zur Anzeige von 'nix davon'.
var
i: Integer; begin i := 1; case i of 2: ShowMessage('2'); 3: ShowMessage('3'); else ShowMessage('nix davon'); end; end; Mit nicht konstanten Werten (geschweige denn mit Strings) wäre solch optimiertes Verhalten nicht möglich. Und soweit ich weiß, machen das andere Sprachen wie C(++) oder Java auch nicht anders. |
Re: Case Frage
warum zieht er was ab?
|
Re: Case Frage
Lies, was Chewie schreibt:
Zitat:
|
Re: Case Frage
Er prüft zunächst, ob i=2 ist. Dann prüft er, ob i=3 ist.
Wir schreiben nun unser i in EAX. Davon ziehen wir 2 ab. War i=2, steht jetzt eine 0 in EAX. War i<>2, könnte es 3 gewesen sein. Deshalb ziehen wir nochmal eins ab. War i=3, steht jetzt eine 0 drin. Sonst behandeln wir unseren else-Fall. Jetzt verstanden? |
Re: Case Frage
aha .. aber was ist daran so rafiniert :stupid:
wie soll er es denn sonst machen? .. naja um wieder OT zu werden: er kann so ja auch prüfen ob eine charKETTE vorhanden ist :? |
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:27 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz