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
Martello hat folgendes geschrieben : |
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
jaenicke hat folgendes geschrieben : |
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
Narses: Beiträge zusammengefasst---
Bergmann89 hat folgendes geschrieben : |
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
BenBE hat folgendes geschrieben : |
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.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!