Autor |
Beitrag |
Martello
      
Beiträge: 131
WIN 2000
TP, C, Delphi 1.0, Turbo Delphi 2006, Delphi 7
|
Verfasst: So 06.06.10 12:44
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
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: 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 ...
_________________ Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
|
|
Bergmann89
      
Beiträge: 1742
Erhaltene Danke: 72
Win7 x64, Ubuntu 11.10
Delphi 7 Personal, Lazarus/FPC 2.2.4, C, C++, C# (Visual Studio 2010), PHP, Java (Netbeans, Eclipse)
|
Verfasst: 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
_________________ Ich weiß nicht viel, lern aber dafür umso schneller^^
|
|
Martello 
      
Beiträge: 131
WIN 2000
TP, C, Delphi 1.0, Turbo Delphi 2006, Delphi 7
|
Verfasst: 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
      
Beiträge: 19315
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Mo 07.06.10 00:06
|
|
Bergmann89
      
Beiträge: 1742
Erhaltene Danke: 72
Win7 x64, Ubuntu 11.10
Delphi 7 Personal, Lazarus/FPC 2.2.4, C, C++, C# (Visual Studio 2010), PHP, Java (Netbeans, Eclipse)
|
Verfasst: 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
_________________ Ich weiß nicht viel, lern aber dafür umso schneller^^
|
|
Martello 
      
Beiträge: 131
WIN 2000
TP, C, Delphi 1.0, Turbo Delphi 2006, Delphi 7
|
Verfasst: 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
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: 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.
_________________ Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
|
|
Martello 
      
Beiträge: 131
WIN 2000
TP, C, Delphi 1.0, Turbo Delphi 2006, Delphi 7
|
Verfasst: 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.
|
|
|