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

Win10
Delphi Alexandria 11.2 Patch 1
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 starontopic starofftopic star
Beiträge: 475
Erhaltene Danke: 51



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

Windows 8.1
Delphi 10.4 Comm. Edition
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: 806
Erhaltene Danke: 17

Win10
Delphi Alexandria 11.2 Patch 1
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
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Di 08.08.17 18:47 
- Nachträglich durch die Entwickler-Ecke gelöscht -
JoelH Threadstarter
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 806
Erhaltene Danke: 17

Win10
Delphi Alexandria 11.2 Patch 1
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: 1600
Erhaltene Danke: 232


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: 19272
Erhaltene Danke: 1740

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), 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.

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

Win10
Delphi Alexandria 11.2 Patch 1
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: 19272
Erhaltene Danke: 1740

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), 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. ;-)
Delphi-Laie
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1600
Erhaltene Danke: 232


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: 19272
Erhaltene Danke: 1740

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), 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.

Für diesen Beitrag haben gedankt: Delphi-Laie