Autor Beitrag
JoelH
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 789
Erhaltene Danke: 17

Win7,10
Delphi XE7 Prof.
BeitragVerfasst: Di 08.08.17 14:32 
Ich habe ein dynamisches Array mit x Elementen. Diese Elemente sind nicht immer alle zwingend belegt. Gibt es eine Möglichkeit die unbelegten Elemente zu erkennen direkt zu erkennen (Eine Art Test auf nil, was hier ja nicht funktioniert)? Oder bleibt mir nur die Möglichkeit alle Elemente händisch zu initialisieren um dann anhand dessen die Unbelegten zu erkennen?

_________________
mfg. Joel
hydemarie
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 375
Erhaltene Danke: 48



BeitragVerfasst: Di 08.08.17 14:44 
Wenn du alle initialisierst, sind doch alle belegt...?
GuaAck
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 266
Erhaltene Danke: 23

Windows 8.1
Delphi 7 Pers.
BeitragVerfasst: Di 08.08.17 15:02 
Hallo,

ich denke, Du must alle Element vorbelegen mit einem Wert, der regulär nicht vorkommen kann. Falls alle Werte vorkommen können, dann brauchst Du ein zweites Feld, in dem Du nur notierst, ob belegt/nicht belegt. Beim Schreiben müssen dann immer beide Felder aktualisiert werden.

Gruß
GuaAck
JoelH Threadstarter
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 789
Erhaltene Danke: 17

Win7,10
Delphi XE7 Prof.
BeitragVerfasst: Di 08.08.17 15:04 
Das ist ja saublöd, es ist ein Array of TColor, dafür dann noch eine separates Array zu bosseln ist ja doof. Und dabei hätte es so einfach sein können :-(

_________________
mfg. Joel
Frühlingsrolle
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1671
Erhaltene Danke: 305

[Win NT] 5.1 x86 6.1 x64
[Delphi] 7 PE, 2006, 10.1 Starter, Lazarus - [C#] VS Exp 2012 - [Android API 15] VS Com 2015, Eclipse, AIDE - [C++] Builder 10.1
BeitragVerfasst: Di 08.08.17 18:47 
Guten Tag JoelH,

mach es dir nicht so schwer und setz' das Array einfach auf 0. Dann ist der Default-Wert nunmal Schwarz, na und :nixweiss: Zum Initialisieren hast du die Funktionen ZeroMemory() oder FillChar().

_________________
„Wo andere blind der Wahrheit folgen, denk daran ... Nichts ist wahr!" (Assassin's Creed I-II)
JoelH Threadstarter
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 789
Erhaltene Danke: 17

Win7,10
Delphi XE7 Prof.
BeitragVerfasst: Mi 09.08.17 09:35 
Ich habe es nun anders gelöst, ich lese jetzt die gefüllten Zellen aus der DB nach, ist zwar nicht schön, aber effizient.

_________________
mfg. Joel
Delphi-Laie
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1394
Erhaltene Danke: 195


Delphi 2 - RAD-Studio 10.1 Berlin
BeitragVerfasst: Mi 09.08.17 15:29 
Vielleicht noch etwas grundsätzliches. Elemente können nie "unbelegt" sein. Alle Variablen, Konstanten, Pointer, Typen usw. sind immer "irgendwie" belegt, also einen Wert innehabend. Auch wenn es nur das Nullelement (bei mathematischen Typen die 0, bei Strings ein Leerstring, bei Pointern der Wert "nil" u.ä.) sein sollte, auch das ist eine "Belegung".
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 18517
Erhaltene Danke: 1572

W10 x64 (Chrome, IE11)
Delphi 10.1 Ent, Oxygene, C# (VS 2015), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Do 10.08.17 06:58 
user profile iconDelphi-Laie hat folgendes geschrieben Zum zitierten Posting springen:
Vielleicht noch etwas grundsätzliches. Elemente können nie "unbelegt" sein.
Dafür gibt es aber Nullable Types. Damit geht das schon. Für Delphi gibt es diese aktuell nur in Bibliotheken wie Spring4D oder einzeln wie hier.

Allerdings sollen Nullable Types 2018 laut aktueller Roadmap mit Delphi 10.3 auch direkt in Delphi integriert werden.

_________________
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!

Für diesen Beitrag haben gedankt: Delphi-Laie
JoelH Threadstarter
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 789
Erhaltene Danke: 17

Win7,10
Delphi XE7 Prof.
BeitragVerfasst: Do 10.08.17 14:19 
user profile iconDelphi-Laie hat folgendes geschrieben Zum zitierten Posting springen:
Vielleicht noch etwas grundsätzliches. Elemente können nie "unbelegt" sein. Alle Variablen, Konstanten, Pointer, Typen usw. sind immer "irgendwie" belegt, also einen Wert innehabend. Auch wenn es nur das Nullelement (bei mathematischen Typen die 0, bei Strings ein Leerstring, bei Pointern der Wert "nil" u.ä.) sein sollte, auch das ist eine "Belegung".

Das ist klar, es ging ja darum genau diese automatisiert zu erkennen. Dass auch diese "Nicht"daten Speicherzellen belegen, die 0 oder 1 sind, und deshalb auch irgendeinen Inhalt haben ist ja klar.

Ich hatte halt folgendes Szenario. Ich habe ein Array von 0 bis MaxID und lese aus der DB beliebige Werte aus und schreibe sie anhand ihrer ID in das Array. Später will ich diese Daten wieder zurück schreiben, aber eben nur die die ich ursprünglich ausgelesen habe. Und da wäre es halt ungemein elegant gewesen wenn ich einfach auf zB. nil hätte testen können. Jetzt lese ich die Matrix eben nochmal aus der DB aus um nur die definierten Werte zurückzuschreiben. Ist eben ein DB Vorgang mehr, hier allerdings unkritisch und deshalb kein Problem. Ich hätte natürlich auch die eingelesenen Ides ebenfalls in ein zweites Array schreiben können. Ich hätte einen eigenen Datentyp entwerfen können und damit das Array initialisieren können. Aber das wäre m.E. alles nicht so trivial einfach gewesen. Ein Programmierer ist halt auch irgendwo ein Stück weit faul.


@jaenicke
hört sich interessant an.

_________________
mfg. Joel
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 18517
Erhaltene Danke: 1572

W10 x64 (Chrome, IE11)
Delphi 10.1 Ent, Oxygene, C# (VS 2015), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Do 10.08.17 14:25 
user profile iconJoelH hat folgendes geschrieben Zum zitierten Posting springen:
Ich hätte natürlich auch die eingelesenen Ides ebenfalls in ein zweites Array schreiben können. Ich hätte einen eigenen Datentyp entwerfen können und damit das Array initialisieren können. Aber das wäre m.E. alles nicht so trivial einfach gewesen.
Trivial schon.
Einfach ein array of Boolean der gleichen Größe, mit 0 initialisiert, dann einfach überall True reinschreiben, wo du gelesen hast. Einfacher geht es kaum. ;-)

_________________
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!
Delphi-Laie
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1394
Erhaltene Danke: 195


Delphi 2 - RAD-Studio 10.1 Berlin
BeitragVerfasst: Do 10.08.17 17:22 
user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
user profile iconJoelH hat folgendes geschrieben Zum zitierten Posting springen:
Ich hätte natürlich auch die eingelesenen Ides ebenfalls in ein zweites Array schreiben können. Ich hätte einen eigenen Datentyp entwerfen können und damit das Array initialisieren können. Aber das wäre m.E. alles nicht so trivial einfach gewesen.
Trivial schon.
Einfach ein array of Boolean der gleichen Größe, mit 0 initialisiert, dann einfach überall True reinschreiben, wo du gelesen hast. Einfacher geht es kaum. ;-)


Naja, statt des zweiten (Boolen-)Arrays einfach mit dem Datentyp Record arbeiten, der zusätzlich einen booleschen Datentyp beinhaltet, denn die Daten gehören ja "eigentlich" zusammen. Dann nur noch ein (1) "array of record" deklarieren und entsprechend füllen / auslesen / beschreiben.
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 18517
Erhaltene Danke: 1572

W10 x64 (Chrome, IE11)
Delphi 10.1 Ent, Oxygene, C# (VS 2015), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Do 10.08.17 17:43 
user profile iconDelphi-Laie hat folgendes geschrieben Zum zitierten Posting springen:
Naja, statt des zweiten (Boolen-)Arrays einfach mit dem Datentyp Record arbeiten, der zusätzlich einen booleschen Datentyp beinhaltet, denn die Daten gehören ja "eigentlich" zusammen. Dann nur noch ein (1) "array of record" deklarieren und entsprechend füllen / auslesen / beschreiben.
Das ist allerdings deutlich langsamer (in unseren Tests ca. Faktor 10) und umständlicher. Die aktuellen nicht compilergestützten Nullable Types funktionieren genau so.

_________________
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!

Für diesen Beitrag haben gedankt: Delphi-Laie