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 1 von 3  1 23   
Andreas L.

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

Case-Statement für Float-Werte

  Alt 15. Jun 2020, 10:01
Delphi-Version: 10.3 Rio
Hallo,
ich habe gerade ein simples Case-Statement mit Single-Werten geschrieben. Leider kann ich es nicht kompilieren. Die Meldung lautet:
Zitat:
E2001 Ordinaltyp erforderlich
Mir ist klar das ein Single kein Ordinal-Typ ist. Aber es kann doch nicht sein das man kein Case auf Float anwenden kann? Wie kann ich das Problem lösen? Gibt es irgendeine Funktion dafür (wie z.B. CharInSet, etc.), muss das über RTTI gemacht werden oder komme ich um einfache If-Abfragen nicht vorbei?

So habe ich es versucht:
Delphi-Quellcode:
  TibZoomFactorPercent = (
    Custom,
    Percent10,
    Percent25,
    Percent50,
    Percent75,
    Percent100,
    Percent125,
    Percent150,
    Percent175,
    Percent200,
    Percent250,
    Percent300,
    Percent400,
    Percent500
  );

function TfrmEditor.GetZoomFactorAsPercent(
  AZoomFactor: Single = 1): TibZoomFactorPercent;
begin
  Result := TibZoomFactorPercent.Custom;
  case AZoomFactor of // Hier tritt der Fehler auf...
    0.10: Result := TibZoomFactorPercent.Percent10;
    0.25: Result := TibZoomFactorPercent.Percent25;
    0.50: Result := TibZoomFactorPercent.Percent50;
    0.75: Result := TibZoomFactorPercent.Percent75;
    1: Result := TibZoomFactorPercent.Percent100;
    1.25: Result := TibZoomFactorPercent.Percent125;
    1.50: Result := TibZoomFactorPercent.Percent150;
    1.75: Result := TibZoomFactorPercent.Percent175;
    2: Result := TibZoomFactorPercent.Percent200;
    2.50: Result := TibZoomFactorPercent.Percent250;
    3: Result := TibZoomFactorPercent.Percent300;
    4: Result := TibZoomFactorPercent.Percent400;
    5: Result := TibZoomFactorPercent.Percent500;
  end;
end;
Andreas Lauß
Blog
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.170 Beiträge
 
Delphi 10.4 Sydney
 
#2

AW: Case-Statement für Float-Werte

  Alt 15. Jun 2020, 10:06
Was spricht dagegen das du nur mit ganzen Prozentwerten arbeitest.
Damit hast du einen Integer und kannst wieder mit case-Statement arbeiten.
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Benutzerbild von haentschman
haentschman

Registriert seit: 24. Okt 2006
Ort: Seifhennersdorf / Sachsen
5.289 Beiträge
 
Delphi 12 Athens
 
#3

AW: Case-Statement für Float-Werte

  Alt 15. Jun 2020, 10:06
Moin...
Zitat:
Wie kann ich das Problem lösen?
...den Eingangswert x 100 vor dem case.
  Mit Zitat antworten Zitat
Benutzerbild von Sherlock
Sherlock

Registriert seit: 10. Jan 2006
Ort: Offenbach
3.762 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: Case-Statement für Float-Werte

  Alt 15. Jun 2020, 10:17
Moin...
Zitat:
Wie kann ich das Problem lösen?
...den Eingangswert x 100 vor dem case.
Trunc nicht vergessen, oder round, oder was auch immer genutzt wird, um ein Integer zu erhalten.

Gleitkommazahlen sind nun mal mathematisch keine Ordinalen.

Sherlock
Oliver
Geändert von Sherlock (Morgen um 16:78 Uhr) Grund: Weil ich es kann
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
10.993 Beiträge
 
Delphi 12 Athens
 
#5

AW: Case-Statement für Float-Werte

  Alt 15. Jun 2020, 10:24
Dazu lässt sich 0.10 auch gar nicht exakt als Single darstellen.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Redeemer

Registriert seit: 19. Jan 2009
Ort: Kirchlinteln (LK Verden)
1.016 Beiträge
 
Delphi 2009 Professional
 
#6

AW: Case-Statement für Float-Werte

  Alt 15. Jun 2020, 10:25
Dazu lässt sich 0.10 auch gar nicht exakt als Single darstellen.
Oder überhaupt als Kommazahl mit Exponenten-Basis 2.
Janni
2005 PE, 2009 PA, XE2 PA
  Mit Zitat antworten Zitat
Benutzerbild von stahli
stahli

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

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.114 Beiträge
 
Delphi 12 Athens
 
#8

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
 
#9

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.336 Beiträge
 
Delphi 11 Alexandria
 
#10

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
Antwort Antwort
Seite 1 von 3  1 23   

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 03:36 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