Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Matrix of ^TElement


Martello - So 06.06.10 12:44
Titel: Matrix of ^TElement
Hallo Mitleser.

Ich konnte folgenden Typ defnieren: Array (0..255,0..255) of ^TElement, und eine entsprechende Variable "anlegen", wobei ^TElement zunächst mal ein Einfachstzeiger für meinen Testzweck ist. Wenn ich mit dieser dyn. Datenstruktur arbeiten möchte, dann muss sie doch zu Programmstart erst einmal erzeugt werden?

Leider habe ich mit Pointern nie Erfahrung gesammelt. Aber ist es nicht so, dass ich also zu Programmstart erst mal jede einzelne meiner 256*256 Stück Listen erzeugen muss, bevor danach damit etwas geschehen kann?

Und wie groß könnte denn meine Matrix höchsten werden: 1024 * 1024 ?
Und wir muss mein ^TElement beschaffen sein (speicherbegrenzt), damit ich keine Probleme mit Speicherressouren bekomme?

Muss ich da vorher selber Schätzungen vornehmen, oder hilft mir der Compiler oder eine andere Entwicklungs-Instanz dabei?

Danke für Hilfestelleung

M.


BenBE - So 06.06.10 16:40

Durch die Angabe der Größe, hast du ein statisches Array/Matrix.

Ja, Du musst allen Elementen beim Programmstart was zuweisen.

Dynamisch wäre es mit array of array of ^TElement.

Der Compiler legt statische Typen bis 2GiB größe an. Für einen Pointer hast Du 4 Byte; bei deiner Matrix also 256*256*4 Byte = 256KiB. Also WEIT davon entfernt. Für den Speicherverbrauch deines Rcord-Typs, gelten die Grenzen des Heaps. Da du maximal 65536 Elemente (bei deinem derzeitigen Typ) hast, müsstest du also die Speichergröße des Record-Typen mit der Element-Anzahl multiplizieren. olange dieser aber kleiner als 2-4 KiB je Record (für deine Matrix-Größe) ist - was etwa 256MiB RAM-Verbrauch entspräche -, brauchst Du dir noch keine sooo großen sorgen machen.

Der Compiler hilft Dir nur beim Auslesen der Datentyp-Größen für die Elemente. Wie ich aber grad gezeigt hab, ist das Abschätzen des Speicherbedarfes nicht sooooo schwierig ...


Bergmann89 - So 06.06.10 18:47

Hey,

wenn du sie gleich beim Start des Programms erzeugen willst, warum nimmst du da nicht gleich ein array of TElement? Da reserviert der Compiler den Speicher. Oder hast du einen bestimmten Grund es über Pointer zu machen?

MfG Bergmann


Martello - So 06.06.10 21:57

Die Zeiger brauche ich, um an manchen Array-Knoten lineare Listen erzeugen zu können. Deren Längen (er-)kenne ich aber erst zur Laufzeit. Da die wenigsten der Matrixelememte überhaupt mit Inhalten versehen werden (ich möchte ein Stück Erdoberfläche damit "vermessen"), kann ich am Anfang allen Matrixelementen erst mal denselben Zeiger zuweisen; was wohl irgendwie identisch ist mit NIL.

Erst bei Programmstart werden dann bestimmte Array-Felder initialisiert, indem sie sich ihre Daten aus einer Datei laden.
So könnte ich - bei Bedarf - wohl auch noch größere Arrays 2048*2048 aufspannen. Denn da zu Beginn nur ein einziger Pointer nötig ist, werde ich wohl von der 65536 Elemente-Grenze einige Zeit lang entfernt bleiben. :?


jaenicke - Mo 07.06.10 00:06

user profile iconMartello hat folgendes geschrieben Zum zitierten Posting springen:
werde ich wohl von der 65536 Elemente-Grenze einige Zeit lang entfernt bleiben. :?
Da hast du glaube ich etwas falsch verstanden. Diese Anzahl ist die in deiner Matrix, denn 256 * 256 = 65536. So viele Elemente hast du also in der statischen Matrix von oben. ;-)


Bergmann89 - Mo 07.06.10 01:36

Hey,

wenn die meißten Elemente eh leer bleiben, würde sich dann eine Liste nich besser machen? Da speicherst du einfach die Koordinaten die du sonst im Array hättest noch mit in deinem TElement.

MfG Bergmann


Martello - Mo 07.06.10 17:38

user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Da hast du glaube ich etwas falsch verstanden. Diese Anzahl ist die in deiner Matrix, denn 256 * 256 = 65536. So viele Elemente hast du also in der statischen Matrix von oben. ;-)


Ja und nein, denn ich hatte vorher in meinem Uralt-TurboPascal-Buch aus den seeligen 16-bit-Zeiten geschmökert, und dort stand auch eine Grenze in dieser Größenordnung für die Gesamtzahl aller möglichen Pointer. Ich komm' einfach nicht los, von den alten Sachen :? . Wahrscheinlich gibt es in Delphi gar keine obere Anzahl für verwendete Pointer, und nur der Speicher gibt die Grenzen vor.

M.

---Moderiert von user profile iconNarses: Beiträge zusammengefasst---

user profile iconBergmann89 hat folgendes geschrieben Zum zitierten Posting springen:
wenn die meißten Elemente eh leer bleiben, würde sich dann eine Liste nich besser machen?


Das Array soll ja eine physikalische Fläche (Erdoberfläche) repräsentieren. Insofern brauche ich schon ein 2-dim-Feld für mein Programm. Die Indizes x und y werden auch mit den tatsächlichen Koordinaten korrespondieren. Speicherprobleme sind keine zu erwarten; das war nur anfängliche Unkenntnis. Aber das orthogonale Feld muss sein. :?

M.


BenBE - Di 08.06.10 09:04

Der Delphi-Compiler hat immer noch eine Grenze drin und das sind 2GB je Datentyp.

Bzgl. der phyikalischen Fläche: OpenStreetMap arbeitet mit Vektor-Daten, statt mit einem physikalischen Raster - und das geht auch.


Martello - Di 08.06.10 10:29

user profile iconBenBE hat folgendes geschrieben Zum zitierten Posting springen:
Bzgl. der phyikalischen Fläche: OpenStreetMap arbeitet mit Vektor-Daten, statt mit einem physikalischen Raster - und das geht auch.


Das kannte ich noch nicht. Werd' ich mir aber mit Interesse anschauen.