AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Case-Statement für Float-Werte

Ein Thema von Andreas L. · begonnen am 15. Jun 2020 · letzter Beitrag vom 17. Jun 2020
Antwort Antwort
Seite 2 von 3     12 3   
Benutzerbild von Stevie
Stevie

Registriert seit: 12. Aug 2003
Ort: Soest
3.759 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#11

AW: Case-Statement für Float-Werte

  Alt 16. Jun 2020, 11:06
Liegt das "nur" am Daten-Typ oder wurde es einfach nicht im Compiler implementiert? Ich hatte mal einen PreCompiler (ich glaube es war IDE Fix Pack oder so ähnlich) mit dem man u. a. Strings in Case verwenden konnte. Das war vor über 10 Jahren... Warum baut Embarcadero sowas nicht mal ein? Floats, Strings, etc. Ich finde das wäre ein tolles Feature...
Das liegt daran, dass ein case nur für Ordinalwerte implementiert wurde und der Compiler eine Jumptable baut - in den Sprachen, die switch case auf mehr als das können, wird dann vom Compiler meist ähnlicher Code erzeugt, wie bei verschachtelten if-then-else Ausdrücken.
Leider ist es bei Delphi wie so oft ein schon lange gewünschtes, aber bisher nicht implementiertes Feature.
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight
  Mit Zitat antworten Zitat
Andreas13

Registriert seit: 14. Okt 2006
Ort: Nürnberg
244 Beiträge
 
Delphi XE5 Professional
 
#12

AW: Case-Statement für Float-Werte

  Alt 16. Jun 2020, 11:12
@Andreas L.:
Vielleicht ließe sich Dein Vorhaben auch wie folgt realisieren:
1:
Die AZoomFactor-Werte von Single in einen String mit nur 3 Ziffern umwandeln
2:
Dann würde die Fallunterscheidung für Strings mittels Case AnsiIndexText(..) funktionieren. Ein Beispiel hierfür findest Du hier: https://www.delphipraxis.net/67511-f...tels-case.html
Andreas
Wenn man seinem Nächsten einen steilen Berg hinaufhilft, kommt man selbst dem Gipfel näher.
John C. Cornelius
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
36.886 Beiträge
 
Delphi 10.4 Sydney
 
#13

AW: Case-Statement für Float-Werte

  Alt 16. Jun 2020, 14:41
Weil CASE im Delphi nur mit ordinalen Typen arbeitet, also Integer/Byte/Char/..., und das intern oft mathematisch (mit Addition/Substraktion) optimiert wird.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
Delphi-Tage 2005-2014

Geändert von himitsu (16. Jun 2020 um 14:42 Uhr) Grund: upps, vergessen abzusenden und dann Seite 2 nicht gesehn
  Mit Zitat antworten Zitat
Rollo62

Registriert seit: 15. Mär 2007
2.826 Beiträge
 
Delphi 10.4 Sydney
 
#14

AW: Case-Statement für Float-Werte

  Alt 16. Jun 2020, 15:02
Moin...
Zitat:
Wie kann ich das Problem lösen?
...den Eingangswert x 100 vor dem case.
Das sehe ich auch als Lösung an, also konkreter mal so in der Art:
Delphi-Quellcode:
function TfrmEditor.GetZoomFactorAsPercent(
  AZoomFactor: Single = 1): TibZoomFactorPercent;
begin
  Result := TibZoomFactorPercent.Custom;
  case Trunc(AZoomFactor * 100) of // Hier tritt der Fehler auf...
      10: Result := TibZoomFactorPercent.Percent10;
      25: Result := TibZoomFactorPercent.Percent25;
      50: Result := TibZoomFactorPercent.Percent50;
      75: Result := TibZoomFactorPercent.Percent75;
    100: Result := TibZoomFactorPercent.Percent100;
    125: Result := TibZoomFactorPercent.Percent125;
    150: Result := TibZoomFactorPercent.Percent150;
    175: Result := TibZoomFactorPercent.Percent175;
    200: Result := TibZoomFactorPercent.Percent200;
    250: Result := TibZoomFactorPercent.Percent250;
    300: Result := TibZoomFactorPercent.Percent300;
    400: Result := TibZoomFactorPercent.Percent400;
    500: Result := TibZoomFactorPercent.Percent500;
  end;
Alles mit "Wert = 0.10" KANN nicht funktionieren, also genausowenig mit case,
weil man float Werte nicht einfach vergleichen kann.
(Siehe unten die Vorschläge mit SameValue)
Deshalb wird es ein case mit float nicht geben können.
  Mit Zitat antworten Zitat
Medium

Registriert seit: 23. Jan 2008
3.619 Beiträge
 
Delphi 2007 Enterprise
 
#15

AW: Case-Statement für Float-Werte

  Alt 17. Jun 2020, 01:08
Um den Grund an sich noch mal auf den Punkt zu bringen:

CASE und IF sind nur funktional miteinander verwandt. CASE war ursprünglich mehr als nur eine andere (kürzere) Schreibart für eine Kette von IF-Statements, da es dem Compiler hier einfacher war effizienteren Maschinencode daraus zu generieren. Einschränkung: Da dafür Sprungtabellen (bestehend aus relativen Adressen, die halt immer ganzzahlig sind) aus den zu unterscheidenden Werten gebildet wurden/werden, waren/sind nur solche als Kriterium zulässig. In Zeiten, in denen jeder einzelne Prozessorzylus noch in vielfachen (Dollar-)Cents zu bemessen war, war das eine lukrative Angelegenheit.
Und auch heute noch sind solche "kleinkarierten" Optimierungen hier und da noch messbare Vorteile - jedoch werden diese immer seltener, und das Argument der einfacheren Schreib-/Lesbarkeit ist in den Vordergrund gerückt. Welcher Seite man als Compiler-Hersteller nun die Stange hält, ist meiner Meinung nach weitestgehend Geschmackssache. Delphi hat die Optimierbarkeit beibehalten, und somit die Beschränkung auf Ordinaltypen. Will man das nicht, muss man mit diesem Compiler etwas tricksen um die Lesbarkeit zu erhalten, oder einen anderen wählen und die Optimierbarkeit aufgeben.
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
36.886 Beiträge
 
Delphi 10.4 Sydney
 
#16

AW: Case-Statement für Float-Werte

  Alt 17. Jun 2020, 02:43
Es gäbe aber keinen Grund Beides nicht zu kombinieren.

Wenn der CASE-Wert Ordinal ist, dann den optimierten Code generieren,
und ansonsten könnte der Compilier das notfalls auch als viele IF-ElseIf-ElseIf-...-Else umsetzen,
bzw. für Strings in ein CASE mit IndexStr/IndexText übersetzen usw.

Denn wenn wir versuchen das Vorhaben so zu optimieren, damit es ins CASE passt,
dann kommt weniger lesbarer Code bei raus, als wenn das der Compilier intern anpassen würde.


Genauso wie es echt saudoof ist, dass IN immernoch als grauenhaftes SET-Assembler übersetzt wird, anstatt es optional mit BitMasken oder InArray umzusetzen.
Oder dass CharInSet intern nur Mist macht und man den Dreck nicht wieder entfernt, weil IN durch ein IN in einer Funktion zu ersetzen, welche einfach nur die CompilerWarnung unterdrückt, dass ist sowas von schwachsinnig nutzlos.
Wobei das CharInSet-Problem sofort behoben ist, wenn man für "IN WideChar" die grade erwähnte Verbesserung hätte, oder einfach die selbe Codeoptimierug verwenden würde, wie aktuell beim CASE.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
Delphi-Tage 2005-2014

Geändert von himitsu (17. Jun 2020 um 02:55 Uhr)
  Mit Zitat antworten Zitat
Rollo62

Registriert seit: 15. Mär 2007
2.826 Beiträge
 
Delphi 10.4 Sydney
 
#17

AW: Case-Statement für Float-Werte

  Alt 17. Jun 2020, 07:35
Und auch heute noch sind solche "kleinkarierten" Optimierungen hier und da noch messbare Vorteile - jedoch werden diese immer seltener, ...
Ich denke CASE hat durchaus seine Berechtigung behalten, wenn mehrere, vieleicht > 3 Fälle bearbeitet werden müssen.
Das sollte immer schneller sein als sequentielles IF.

Falls du Recht hast das dies nicht schneller ist würde es doch bedeuten
das der Compiler das IF intern doch als Sprungtabelle optimiert, oder nicht ?

Schneller wäre vielleicht nur ein Auslagern in Prozeduren-Pointer, als einfache State-Machine
statt CASE oder IF, aber auch das bezweifele ich wenn im case nur wenig gemacht wird.
Da kann der Compiler doch perfekt optimieren (wenn er das könnte).

Die Sprungtebellen der CPU sollten doch das effektivste Mittel bleiben, oder habe ich da was verpasst ?
(Ich habe aber die letzten Jahre intensives CPU-Technologie Studium geschwänzt, Hauptsache das Ding läuft )
  Mit Zitat antworten Zitat
Medium

Registriert seit: 23. Jan 2008
3.619 Beiträge
 
Delphi 2007 Enterprise
 
#18

AW: Case-Statement für Float-Werte

  Alt 17. Jun 2020, 10:16
Und auch heute noch sind solche "kleinkarierten" Optimierungen hier und da noch messbare Vorteile - jedoch werden diese immer seltener, ...
Ich denke CASE hat durchaus seine Berechtigung behalten, wenn mehrere, vieleicht > 3 Fälle bearbeitet werden müssen.
Das sollte immer schneller sein als sequentielles IF.
Schneller wird es wohl sein. Aber die Wichtigkeit minimaler Geschwindigkeitsunterschiede zu Codeles- und wartbarkeit ist dank der immensen Gesamtgeschwindigkeit der Rechner nicht mehr dieselbe wie damals. (Natürlich gibt es Situationen, in denen das noch immer merkbar ist, wo sich jeder wegoptimierte Zyklus lohnt. Aber das sind eine Hand voll spezieller Dinge fernab des Tagesgeschäftes der meisten Entwickler.)

Edit: Um das klar zu stellen: Ich sage nicht, dass case schlechter lesbar ist als if-Kaskaden. Aber ein "auf deubel komm raus" Klimmzug um mit eigentlich nicht passenden Typen es dennoch irgendwie in ein case zu pressen verliert definitiv zumindest an Wartbarkeit, da man Umwege einführt die man ggf. als Dritter nicht erwartet, und jede zusätzliche Zeile Code wieder eine mögliche Fehlerquelle mehr ist.
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)

Geändert von Medium (17. Jun 2020 um 10:20 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General
Online

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.153 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#19

AW: Case-Statement für Float-Werte

  Alt 17. Jun 2020, 10:26
Es gibt ja keinen Grund nicht beides haben zu können. Wenn es ein Ordinalwert ist macht der Compiler alles wie bisher. Wenns kein Ordinalwert ist, wirds intern eben wie ein verschachteltes if-else behandelt.
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

Registriert seit: 12. Aug 2003
Ort: Soest
3.759 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#20

AW: Case-Statement für Float-Werte

  Alt 17. Jun 2020, 15:07
Edit: Um das klar zu stellen: Ich sage nicht, dass case schlechter lesbar ist als if-Kaskaden. Aber ein "auf deubel komm raus" Klimmzug um mit eigentlich nicht passenden Typen es dennoch irgendwie in ein case zu pressen verliert definitiv zumindest an Wartbarkeit, da man Umwege einführt die man ggf. als Dritter nicht erwartet, und jede zusätzliche Zeile Code wieder eine mögliche Fehlerquelle mehr ist.
Korrekt - deshalb liegt guten Designern und Entwicklern von Programmiersprachen sehr viel daran, Syntax ggf zu erweitern, dass man Dinge intuitiv schreiben kann, ohne Klimmzüge zu machen, siehe Pattern Matching in C#.
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:55 Uhr.
Powered by vBulletin® Copyright ©2000 - 2020, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2020 by Daniel R. Wolf