Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Wert "nicht gesetzt" bei primitiven Datentypen - wie? (https://www.delphipraxis.net/196228-wert-nicht-gesetzt-bei-primitiven-datentypen-wie.html)

Caps 2. Mai 2018 15:27


Wert "nicht gesetzt" bei primitiven Datentypen - wie?
 
Hallöle,

ehrlich gesagt komme ich mir etwas dumm vor mit der Frage, aber da ich geraume Zeit nicht mehr in Delphi entwickelt habe, bin ich jetzt vermutlich blind für die naheliegendste Lösung:

Ich möchte eine Datenstruktur implementieren (z.B. geschachtelte Records) mit bunt gemischten - meist primitiven Datentypen (Integer, String etc.).
Die Werte der Felder dieser Datenstruktur sollen aber eine mind. dreiwertige Logik haben, d.h. vor allem den Wert "nicht gesetzt" bzw. "unbekannt".
Bei einem Boolean-Feld soll also möglich sein {True, False, NULL}.

Ich weiß, dass ein Boolean nicht undefiniert sein kann, aber ich habe diese Anforderung.
Wie würdet Ihr das am einfachsten lösen?

lg Caps

Caps 2. Mai 2018 15:28

AW: Dreiwertige Logik mit primitiven Datentypen - wie?
 
[strike]Ähm, der Titel ist vllt. etwas unglücklich gewählt, sorry.
Ich weiß aber momentan nicht, wie ich ihn ändern kann... :oops:[/strike]

Stevie 2. Mai 2018 15:28

AW: Dreiwertige Logik mit primitiven Datentypen - wie?
 
Delphi-Quellcode:
Nullable<Boolean>
aus Spring4D oder anderen Bibliotheken.

Falls eine einfachere Lösung gewünscht ist, einen Enum-Typen wählen, der einen von 3 Werten haben kann.

Delphi-Quellcode:
type
  TMeinEnum = (True, False, Null);
Bei dieser Benamung allerdings aufpassen, da es mit dem Boolean.True und False kollidieren kann, also evtl prefixen oder anders nennen.

Caps 2. Mai 2018 15:31

AW: Wert "nicht gesetzt" bei primitiven Datentypen - wie?
 
Danke, ich fürchte aber unsere Delphi-Version ist zu alt.
Was wäre eine Alternative ohne Generics (ich vermute "<Boolean>" ist sowas).

Caps 2. Mai 2018 15:44

AW: Wert "nicht gesetzt" bei primitiven Datentypen - wie?
 
Ja, bei Boolean würden Enums noch gehen, aber was mache ich bei String...(?)
In PHP war's so einfach :gruebel:

Neutral General 2. Mai 2018 15:49

AW: Wert "nicht gesetzt" bei primitiven Datentypen - wie?
 
Du machst ungefähr sowas:
Delphi-Quellcode:
TNullableString = record
  Value: String;
  IsNull: Boolean;
end
Kann man noch etwas luxuriöser machen mit operator overloading aber ich schätze dafür ist dein Delphi dann auch zu alt.
Ansonsten würde die 08/15-Implementierung der generischen Version die Stevie vorgeschlagen hat ca so aussehen:
Delphi-Quellcode:
TNullable<T> = record
  Value: T;
  IsNull: Boolean;
end

var nullableStr: TNullable<String>;

Uwe Raabe 2. Mai 2018 15:54

AW: Wert "nicht gesetzt" bei primitiven Datentypen - wie?
 
Wenn sowieso schon eine so alte Delphi-Version im Spiel ist, dann kann man ja auch gleich auf alte Technik setzen und mit Variants arbeiten.

Caps 2. Mai 2018 16:00

AW: Wert "nicht gesetzt" bei primitiven Datentypen - wie?
 
Ok, danke erstmal, den separaten NULL-Indikator finde ich ganz praktikabel, bei Varianten muss ich mich erst ein wenig mit beschäftigen, damit habe ich noch nicht kreativ gearbeitet ^^.
Ich hatte auch überlegt, ob ich alle Werte in String konvertiere und dann eine Konstante (z.B. "__NULL__") definiere, die garantiert(...!) nie vorkommt - naja... Krücke.

himitsu 2. Mai 2018 20:36

AW: Wert "nicht gesetzt" bei primitiven Datentypen - wie?
 
Delphi-Referenz durchsuchenVariant kennt diesbezüglich 3 Zustände:
Empty (kein Wert vorhanden)
Null (der Wert "Nichts")
Wert (z.B. True oder False)

Zitat:

Nullable<Boolean> aus Spring4D oder anderen Bibliotheken.
Sollte nicht demnächst auch in Delphi Nullable-Typen "nativ" eingeführt werden?

Aber so oder so, entweder wird es ein größerer Typ, welcher eine zusätzliche Speicherstelle für den zusätzlichen "Wert" besitzt,
oder du nutzt eben einen der vorhandenen Werte und nutzt ihn als "Nullable"-Markierung. (beim String einen bestimmten String und bei nummerischen Typen eben eine bestimmte Zahle)
Nur bei Fließkommazahlen kannst du einen der 3 vordeffinierten Sonderwerte nutzen (NAN, Inf oder NegInf) oder eben bei den Variant-Typen, bzw. eine der vorgeschlagenen Nullable-Deklarationen.

Codehunter 3. Mai 2018 08:04

AW: Wert "nicht gesetzt" bei primitiven Datentypen - wie?
 
Je nach Anwendungsfall könnte auch eine Universallösung sinnvoll sein:
Delphi-Quellcode:
type
  TNullableValue = record
    IsNull: Boolean;
    ValueBool: Boolean;
    ValueInt: Integer;
    ValueString: string;
    { usw. }
  end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:04 Uhr.
Seite 1 von 2  1 2      

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