AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

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 2     12   
Medium

Registriert seit: 23. Jan 2008
3.679 Beiträge
 
Delphi 2007 Enterprise
 
#1

AW: Case-Statement für Float-Werte

  Alt 17. Jun 2020, 09: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 09:20 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von stahli
stahli

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.337 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: Case-Statement für Float-Werte

  Alt 15. Jun 2020, 10:26
Entweder Round(AZoomFactor * 100) oder

mehrere if´s in dieser Form:
Delphi-Quellcode:
function TfrmEditor.GetZoomFactorAsPercent(
  AZoomFactor: Single = 1): TibZoomFactorPercent;
begin
  Result := TibZoomFactorPercent.Custom;

  if (AZoomFactor = 0.10) then Exit(TibZoomFactorPercent.Percent10);
  if (AZoomFactor = 0.25) then Exit(TibZoomFactorPercent.Percent25);
...
end;
Im Grunde ist die zweite Variante noch übersichtlicher.
Sie ist etwas aufwendiger zu tippen, aber das ist ja ein einmaliger Aufwand. Man ist auch etwas freier in der Ausgestaltung.

Zu beachten ist, dass Floatwerte immer Ungenauigkeiten beinhalten können.
Deshalb sollte man ggf. eine Funktion wie SameValue zum Vergleich verwenden.
Stahli
http://www.StahliSoft.de
---
"Jetzt muss ich seh´n, dass ich kein Denkfehler mach...!?" Dittsche (2004)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.202 Beiträge
 
Delphi 12 Athens
 
#3

AW: Case-Statement für Float-Werte

  Alt 15. Jun 2020, 10:56
Und statt AZoomFactor = 0.10 bei Floats besser mit Delphi-Referenz durchsuchenSameValue rumspielen.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Andreas L.

Registriert seit: 23. Mai 2011
Ort: Furth im Wald
308 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: Case-Statement für Float-Werte

  Alt 16. Jun 2020, 09:25
Danke für eure vielen Antworten. Das ich mit ganzen Prozenten oder mit If-Abfragen das Problem lösen kann war mir von Anfang an klar. Ich wollte nur wissen warum es nicht möglich ist Float-Werte in einem Case-Statement zu verwenden. Ebenso Strings. 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...
Andreas Lauß
Blog
  Mit Zitat antworten Zitat
Benutzerbild von stahli
stahli

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.337 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: Case-Statement für Float-Werte

  Alt 16. Jun 2020, 10:01
Ja, ich fände das auch gut.

Es würde sich ja lediglich um eine andere Schreibweise von if-Statements handeln.
Der Compiler könnte quasi identischen Maschinencode wie bei if-Statements erzeugen.

Schwieriger wäre sicherlich, das auch dem Debugger beizubringen.

Wie hoch der Aufwand letztlich in Summe wäre, kann ich nicht wirklich beurteilen.
Stahli
http://www.StahliSoft.de
---
"Jetzt muss ich seh´n, dass ich kein Denkfehler mach...!?" Dittsche (2004)
  Mit Zitat antworten Zitat
Andreas13

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

AW: Case-Statement für Float-Werte

  Alt 16. Jun 2020, 10: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
Grüße, 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 Stevie
Stevie

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

AW: Case-Statement für Float-Werte

  Alt 16. Jun 2020, 10: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
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.202 Beiträge
 
Delphi 12 Athens
 
#8

AW: Case-Statement für Float-Werte

  Alt 16. Jun 2020, 13: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.
my Delphi wish list : BugReports/FeatureRequests

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


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 13:23 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz