Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Case Frage (https://www.delphipraxis.net/23788-case-frage.html)

Nicodius 9. Jun 2004 18:45


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

Luckie 9. Jun 2004 18:50

Re: Case Frage
 
Sie haben es nicht ausgeschlossen. Es ist nicht möglich, da case nur mit ordinal Werten arbeitet.

Nicolai1234 9. Jun 2004 18:59

Re: Case Frage
 
Ich glaub er meint, warum case nur mit ordinaltypen arbeitet! Warum also Borland das so gebaut hat´?

Steve 9. Jun 2004 19:01

Re: Case Frage
 
öhm so verständnishalber mal ne kleine Beschreibung, was "ordinal" bedeutet, dann is das eigentlich klar ;)

Zitat:

Die "case"-Anweisung benötigt eine Variable von ordinalem Typ. Ordinale Typen sind abzählbare Typen. Abzählbar sind zB alle Integer-Typen, der Typ char etc.
mfg
Stephan

Nicodius 9. Jun 2004 19:01

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:

Chewie 9. Jun 2004 19:11

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:
var
  i: Integer;
begin
  i := 1;
  case i of
    2: ShowMessage('2');
    3: ShowMessage('3');
  else
    ShowMessage('nix davon');
  end;
end;
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'.
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.

Nicodius 9. Jun 2004 19:15

Re: Case Frage
 
warum zieht er was ab?

Luckie 9. Jun 2004 19:17

Re: Case Frage
 
Lies, was Chewie schreibt:
Zitat:

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.
Um festzustellen ob ein case-Zweig zutrifft.

Chewie 9. Jun 2004 19:18

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?

Nicodius 9. Jun 2004 19:18

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.
Seite 1 von 2  1 2      

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