Autor Beitrag
Martello
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 131

WIN 2000
TP, C, Delphi 1.0, Turbo Delphi 2006, Delphi 7
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
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)
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 131

WIN 2000
TP, C, Delphi 1.0, Turbo Delphi 2006, Delphi 7
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19315
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
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)
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 131

WIN 2000
TP, C, Delphi 1.0, Turbo Delphi 2006, Delphi 7
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 131

WIN 2000
TP, C, Delphi 1.0, Turbo Delphi 2006, Delphi 7
BeitragVerfasst: 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.