Delphi-PRAXiS
Seite 7 von 8   « Erste     567 8      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Delphi Maßeinheiten als Typen (https://www.delphipraxis.net/198184-masseinheiten-als-typen.html)

Uwe Raabe 16. Okt 2018 07:50

AW: Maßeinheiten als Typen
 
Zitat:

Zitat von freimatz (Beitrag 1415827)
Wenn ich 1437 Gramm hätte und das als Kilogramm wollte, dann würde ich schon 1.437 Kilogramm wollen.

Ich kann zwar die Implementierung hier nicht sehen, aber nach meinem Vorschlag sollte jedenfalls genau das dabei herauskommen. Zumindest ist das in meinem Beispiel von #14 so.

KodeZwerg 16. Okt 2018 08:08

AW: Maßeinheiten als Typen
 
Wir sind doch erst auf Seite 7, da kommt noch mehr :-]

Uwe Raabe 16. Okt 2018 08:19

AW: Maßeinheiten als Typen
 
Zitat:

Zitat von freimatz (Beitrag 1415827)
Wenn ich 1437 Gramm hätte und das als Kilogramm wollte, dann würde ich schon 1.437 Kilogramm wollen.

Ich sehe gerade, daß dort mit Int64 statt einem Float-Typ gearbeitet wird. Dann kann das natürlich wirklich nicht funktionieren.

Sherlock 16. Okt 2018 09:29

AW: Maßeinheiten als Typen
 
Verstehe ich das richtig, daß hier die eierlegende Wollmilchsau gesucht wird? Das ist sowas von nicht KISS, jeder Vorschlag dafür würde bei uns im Keim erstickt werden. Aber für akademische Diskussionen sicherlich schön.

Sherlock

TiGü 16. Okt 2018 09:56

AW: Maßeinheiten als Typen
 
Zitat:

Zitat von Ghostwalker (Beitrag 1415825)
Delphi-Quellcode:
TYPE
  TGramm = -9223372036854775807..9223372036854775807;
  TKilo = -9223372036854775..9223372036854775;
  TTonne = -9223372036854..9223372036854;
  TMegat = -9223372036..9223372036;
Damit hätte ich die meisten Anforderungen eigentlich abgedeckt. Was meint ihr ?

Wirklich? Ein ganzzahliger negativer Wertebereich? Für Gewicht? :roll:

"Ich hätte gerne minus 3 kg Gehacktes!"

Hoffentlich sieht kein Kollege von dir diesen Thread.

freimatz 16. Okt 2018 10:25

AW: Maßeinheiten als Typen
 
Zitat:

Zitat von TiGü (Beitrag 1415847)
Wirklich? Ein ganzzahliger negativer Wertebereich? Für Gewicht? :roll:
"Ich hätte gerne minus 3 kg Gehacktes!"

Das bedeutet dann "Ich würde gerne 3 kg Gehacktes zurückgeben." :lol:
Wirft zwar eine ENotHygienicException, aber was solls ;-)

Ghostwalker 16. Okt 2018 13:05

AW: Maßeinheiten als Typen
 
@TiGü

Wie ich bereits, gefühlte 1000 mal geschrieben hab, ist das ein Beispiel. Ob du nun Gewichte, Zeit, Längen oder Engström nutzt ist fürs prinzipielle Vorgehen relativ wurscht.

@freimatz

Nein, da es kein "class const" gibt. Um die umrechnerei in den Class Operatoren unter zu kriegen, muss man den Umweg über "class var" in Verbindung mit dem Class Constructor gehen. Emba hats in TTimespan z.B. auch so gemacht.

Uwe Raabe 16. Okt 2018 13:13

AW: Maßeinheiten als Typen
 
Zitat:

Zitat von Ghostwalker (Beitrag 1415864)
Nein, da es kein "class const" gibt.

Was würde denn dann eine
Delphi-Quellcode:
class const
Konstante von einer gemeinen
Delphi-Quellcode:
const
Konstante unterscheiden? :gruebel:

Delphi-Quellcode:
  TGewicht = Record
  private const
    GrammPerKilo = 1000;
    GrammPerTonne = 1000+GrammPerKilo;
    GrammPerMegat = 1000*1000*GrammPerTonne;
  End;

Raible 16. Okt 2018 13:55

AW: Maßeinheiten als Typen
 
Hallo zusammen,

ich habe mal einen record für Werte mit SI-Einheit umgesetzt.

Code:
 
TSIValue = record
  Value   : double;
  UnitExpr : TSIUnitExpression;
  ...

TSIUnitExpression = record
private
  FUnitArray :TSIUnitArray;
  ...

TSIUnitArray = TArray<TSIUnit>;

TSIUnit = record
  Praefix  :TSIPraefix;
  UnitTyp  :TSIUnitTyp;
  Power    :shortint;
  ...

  {$SCOPEDENUMS ON}
  TSIPraefix = (
    Yotta,
    Zetta,
    Exa,
    Peta,
    Tera,
    Giga,
    Mega,
    Kilo,
    Hekto,
    Deka,
    None,
    Dezi,
    Zenti,
    Milli,
    Mikro,
    Nano,
    Piko,
    Femto,
    Atto,
    Zepto,
    Yokto);

  TSIUnitTyp = (
    None,

    //SI Basiseinheiten
    Metre,
    Gramm,
    Second,
    Ampere,
    Kelvin,
    Mole,
    Candela,

    //nicht SI Basiseinheiten
    Euro,

    //Abgeleitete SI-Einheiten
    Newton,
    Joule,
    Watt,
    Coulomb,
    Volt,
    Ohm,
    Farad,
    &Pascal,
    Bar
   );
  {$SCOPEDENUMS OFF}
die Einheit TSIUnit setzt sich dabei aus einem Einheitentyp (m, sec, g, ...), einem Faktor (TSIPraefix G, M, k, ...) und einer Potenz zusammen. Die Potenz ist wichtig für zB. m² oder für Einheiten im Nenner.

TSIUnitExpression definiert eine Liste von TSIUnit die miteinander Multipliziert die eigentliche Einheit darstellt.
Hier kann dann z.B N = kg*m/sec² realisiert werden.

Möchte man zwei TSIValue miteinander verrechnen müssen auch die TSIUnitExpression mathematisch korrekt verrechnet werden.

Beispiel:
Code:
var
  Masse:TSIValue;
  Laenge:TSIValue;
  Zeit:TSIValue;
  Kraft:TSIValue;
  Text:string;

begin
  Masse := '5 kg'
  Laenge:= '123 cm';
  Zeit := '10 s';
  Kraft := Masse * Laenge / (Zeit * Zeit);
  Text := Kraft; // Text='0.06 m*kg/s²'

Bei Interesse könnte ich den Code
auch zur Verfügung stellen.
Allerdings benötige ich dann etwas
Hilfe bei Lizenzierungsfragen.

Ghostwalker 17. Okt 2018 05:14

AW: Maßeinheiten als Typen
 
Zitat:

Zitat von Uwe Raabe (Beitrag 1415867)
Zitat:

Zitat von Ghostwalker (Beitrag 1415864)
Nein, da es kein "class const" gibt.

Was würde denn dann eine
Delphi-Quellcode:
class const
Konstante von einer gemeinen
Delphi-Quellcode:
const
Konstante unterscheiden? :gruebel:

Delphi-Quellcode:
  TGewicht = Record
  private const
    GrammPerKilo = 1000;
    GrammPerTonne = 1000+GrammPerKilo;
    GrammPerMegat = 1000*1000*GrammPerTonne;
  End;

Ganz einfach.

Bei "private const" stehen die Konstanten nur in einer konkreten Instanz (sprich Variable) zur Verfügung.
Folglich (und das hat mir der Delphi-Compiler recht deutlich mitgeteilt) kann man sie so nicht in den
Operatoren verwenden.

Also hab ich mir ein Beispiel an Emba genommen und das ganze wie oben umgesetzt. Damit kann ich die Konstanten auch in den Operatoren verwenden.


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:27 Uhr.
Seite 7 von 8   « Erste     567 8      

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