AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Algorithmen, Datenstrukturen und Klassendesign Wert "nicht gesetzt" bei primitiven Datentypen - wie?
Thema durchsuchen
Ansicht
Themen-Optionen

Wert "nicht gesetzt" bei primitiven Datentypen - wie?

Ein Thema von Caps · begonnen am 2. Mai 2018 · letzter Beitrag vom 3. Mai 2018
Antwort Antwort
Seite 1 von 2  1 2      
Caps

Registriert seit: 23. Mär 2006
Ort: Leipzig
299 Beiträge
 
#1

Wert "nicht gesetzt" bei primitiven Datentypen - wie?

  Alt 2. Mai 2018, 16:27
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
"Der Mode cmCFS8 ist prohibitär und von mir entwickelt."
  Mit Zitat antworten Zitat
Caps

Registriert seit: 23. Mär 2006
Ort: Leipzig
299 Beiträge
 
#2

AW: Dreiwertige Logik mit primitiven Datentypen - wie?

  Alt 2. Mai 2018, 16:28
[strike]Ähm, der Titel ist vllt. etwas unglücklich gewählt, sorry.
Ich weiß aber momentan nicht, wie ich ihn ändern kann... [/strike]
"Der Mode cmCFS8 ist prohibitär und von mir entwickelt."

Geändert von Caps ( 2. Mai 2018 um 16:30 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

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

AW: Dreiwertige Logik mit primitiven Datentypen - wie?

  Alt 2. Mai 2018, 16:28
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.
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight

Geändert von Stevie ( 2. Mai 2018 um 16:33 Uhr)
  Mit Zitat antworten Zitat
Caps

Registriert seit: 23. Mär 2006
Ort: Leipzig
299 Beiträge
 
#4

AW: Wert "nicht gesetzt" bei primitiven Datentypen - wie?

  Alt 2. Mai 2018, 16:31
Danke, ich fürchte aber unsere Delphi-Version ist zu alt.
Was wäre eine Alternative ohne Generics (ich vermute "<Boolean>" ist sowas).
"Der Mode cmCFS8 ist prohibitär und von mir entwickelt."
  Mit Zitat antworten Zitat
Caps

Registriert seit: 23. Mär 2006
Ort: Leipzig
299 Beiträge
 
#5

AW: Wert "nicht gesetzt" bei primitiven Datentypen - wie?

  Alt 2. Mai 2018, 16:44
Ja, bei Boolean würden Enums noch gehen, aber was mache ich bei String...(?)
In PHP war's so einfach
"Der Mode cmCFS8 ist prohibitär und von mir entwickelt."
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

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

AW: Wert "nicht gesetzt" bei primitiven Datentypen - wie?

  Alt 2. Mai 2018, 16:49
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>;
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 Uwe Raabe
Uwe Raabe

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

AW: Wert "nicht gesetzt" bei primitiven Datentypen - wie?

  Alt 2. Mai 2018, 16:54
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.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Caps

Registriert seit: 23. Mär 2006
Ort: Leipzig
299 Beiträge
 
#8

AW: Wert "nicht gesetzt" bei primitiven Datentypen - wie?

  Alt 2. Mai 2018, 17:00
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.
"Der Mode cmCFS8 ist prohibitär und von mir entwickelt."
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Wert "nicht gesetzt" bei primitiven Datentypen - wie?

  Alt 2. Mai 2018, 21:36
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.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.

Geändert von himitsu ( 3. Mai 2018 um 03:20 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Codehunter
Codehunter

Registriert seit: 3. Jun 2003
Ort: Thüringen
2.272 Beiträge
 
Delphi 10.4 Sydney
 
#10

AW: Wert "nicht gesetzt" bei primitiven Datentypen - wie?

  Alt 3. Mai 2018, 09:04
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;
Ich mache grundsätzlich keine Screenshots. Schießen auf Bildschirme gibt nämlich hässliche Pixelfehler und schadet der Gesundheit vom Kollegen gegenüber. I und E zu vertauschen hätte den selben negativen Effekt, würde aber eher dem Betriebsklima schaden
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 16:32 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