Autor Beitrag
FabianS
Hält's aus hier
Beiträge: 8

Microsoft Windows 98SE
Delphi 6 Personal
BeitragVerfasst: So 30.01.05 16:34 
Hi!

Ich habe folgendes Problem. Ich habe ein dreidimensionales Array.
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
TYPE TMatrix = Array[0..1000..1000..100of SmallInt;

...

VAR Matrix: TMatrix;


wie kann ich jetzt ein dynamisches Array erzeugen, welches mir erlaubt zur Laufzeit des Programmes die Array-Werte zu setzen.

Ich möchte nämlich ein Array erstellen, welches 1024^3 werte speichern kann.

-Geht das, was ich vorhabe gar nicht über TYPE definitions?
-Sollte ich Pointer verwenden? Wenn JA, wie macht man das? (bitte hier genauere Erklärung)

Mit freundlichen Grüßen,
FabianS

Moderiert von user profile iconChristian S.: Code- durch Delphi-Tags ersetzt.
FabianS Threadstarter
Hält's aus hier
Beiträge: 8

Microsoft Windows 98SE
Delphi 6 Personal
BeitragVerfasst: So 30.01.05 16:58 
habe etwas noch gefunden und folgendes erarbeitet:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
//folgendes erstellt ein array mit den dimensionen 1000^3, wenn ich alles richtig verstanden habe...

TYPE TMatrix = Array of Array of Array of Integer;

VAR Matrix: TMatrix;

Anzahl := 1000;

SetLength(Matrix,Anzahl);
for counter1 := 0 to (anzahl-1do
  begin
    SetLength(Matrix[counter1],Anzahl);
    for counter2 := 0 to (anzahl-1do
      begin
  SetLength(Matrix[counter1,counter2], Anzahl);
      end;
  end;


wäre das dann die art, ein dreidimensionales array zu erzeugen, welches die dimensionen der grösse der variable "Anzahl" hat?

Moderiert von user profile iconraziel: Code- durch Delphi-Tags ersetzt.
Johannes Maier
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 173

Win XP
D7 Prof
BeitragVerfasst: So 30.01.05 17:47 
Ich kenne mich damit auch nicht sehr gut aus, aber der Code zur Erzeugung stimmt schon.
Ich denke nur, dass es kein Array mit 1000^3 Dimensionen ist sondern eins mit 3 Dimensionen und dem "Fassungvermögen" (wie nennt man das?) 1000000000.
Achja, wenn du weißt, dass es 1024*1024*1024 groß sein soll, wieso machst du es dann nicht mit dem Code aus dem oberen Posting, oder hab ich das was falsch verstanden?

_________________
MfG
Johannes ehem. jbmaier
FabianS Threadstarter
Hält's aus hier
Beiträge: 8

Microsoft Windows 98SE
Delphi 6 Personal
BeitragVerfasst: So 30.01.05 17:50 
meine güte, sorry. ich stifte ja immer heillose verwirrung mit dem was ich sage. sicher hast du völlig recht. ich wollte auch NCIHT 1000^3 DIMENSIONEN schaffen, sondern nur 1000^3 mögliche werte die setztbar sind. (du nennst es fassungsvermögen... kA wie's richtig heißt..^^)

danke!
mfg fabian
I.MacLeod
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 109



BeitragVerfasst: So 30.01.05 18:03 
Nja... eigentlich sollte das so funktionieren:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
var
  foo: array of array of array of TBar;

...

SetLength(foo, 102410241024);


Aber du solltest auch bedenken, dass du so schon 1 GB an RAM verbrauchst, wenn du nur ein byte für jede Position reservierst (zzgl. Referenz- & Längenzähler).
tommie-lie
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 4373

Ubuntu 7.10 "Gutsy Gibbon"

BeitragVerfasst: So 30.01.05 19:38 
I.MacLeod hat folgendes geschrieben:
Aber du solltest auch bedenken, dass du so schon 1 GB an RAM verbrauchst, wenn du nur ein byte für jede Position reservierst (zzgl. Referenz- & Längenzähler).
Es muss nicht 1GB RAM sein, es reicht schon, wenn soviel logischer Speicher zur Verfügung steht (über das Swapping/Paging-System). Allerdings habe ich das eben mal ausprobiert, es dauert ewig, 1GB zu allokieren, selbst wenn man 512MB RAM hat, denn der Festplattenzugriff ist schon enorm. Allerdings kann man das Array nicht auf dem Stack erzeugen, denn der kann nur 16MB groß sein.
Mit Pointern und einem einzigen Speicherblock spart man zwar ein bisschen Overhead, aber bei einem Gigabyte Daten kommt es auf 8MB auch nicht mehr an...

Du solltest dir lieber Gedanken darüber machen, ob du wirklich solche Mengen brauchst, denn irgendwie tippe ich bei sowas immer auf Design-Flaw...

_________________
Your computer is designed to become slower and more unreliable over time, so you have to upgrade. But if you'd like some false hope, I can tell you how to defragment your disk. - Dilbert
FabianS Threadstarter
Hält's aus hier
Beiträge: 8

Microsoft Windows 98SE
Delphi 6 Personal
BeitragVerfasst: So 30.01.05 23:45 
wie könnte ich denn sonst eine solche enorme matrix realisieren?
ich meine ich könnte das array auch vom typ boolean machen. das wäre auch ok. würde das weniger speicherplatz nehmen?
oder wie gesagt: sollte/kann man da was mit pointer machen, wenn ja, wie?

mfg fabian

p.s. ich muss nur zwei verschiedene werte (0 oder 1) auf die punkte setzen können. wie würde ich denn dann das nur nehmen? also ich sehe ein, das der Integer-Typ eine schlechte wahl ist! ;)
Motzi
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2931

XP Prof, Vista Business
D6, D2k5-D2k7 je Prof
BeitragVerfasst: Mo 31.01.05 00:02 
Also ein Array für 1024^3 Werte, wobei jeder Wert ein 4Byte Integer ist würde 4GB benötigen.. selbst wenn du anstatt eines Integers Booleans nehmen würdest würdest du auf 1GB kommen. Aber auch wenn der Adressraum eines Prozesses 4GB groß ist und du genügend RAM und eine ausreichend große Auslagerungsdatei hast wirst du wohl kaum einen 1GB großen Array verwenden können, da du (aufgrund der Fragmentierung) in deinem Adressraum kaum einen Platz finden wirst wo du dieses Riesen-Array in einem Stück ablegen kannst.

Wenn du nur 0 und 1 setzen können musst, warum arbeitest du dann nicht auf Bit-Ebene? Dann würde ein Integer-Array mit 32^3 Werten reichen, da du ja in jedem Integer 32-Werte speichern kannst..!

_________________
gringo pussy cats - eef i see you i will pull your tail out by eets roots!
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: Mo 31.01.05 00:28 
TFileStream und dort dann immer 1MH-große Teilbereiche in den Speicher kopieren, je nachdem welches grad gebraucht wird ...

_________________
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.
FabianS Threadstarter
Hält's aus hier
Beiträge: 8

Microsoft Windows 98SE
Delphi 6 Personal
BeitragVerfasst: Mo 31.01.05 00:45 
mh..

@motzi
wie kann ich denn nur EIN bit reservieren? oder geht das gar net?

@BenBE
TFileStream sagt mir nix. könntest du ein beispiel machen, wie man FileStream nutzen könnte?

danke schonmal für die hilfe soweit..

na toll...

selbst wenn ich

ausblenden Delphi-Quelltext
1:
array of array of array of 0..1					


nutze, komme ich noch auf rund 120 MB RAM. hab aber nur 64MB ^^

mfg fabian

Moderiert von user profile iconMotzi: Postings zusammengefügt.
Motzi
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2931

XP Prof, Vista Business
D6, D2k5-D2k7 je Prof
BeitragVerfasst: Mo 31.01.05 01:04 
FabianS hat folgendes geschrieben:
@motzi
wie kann ich denn nur EIN bit reservieren? oder geht das gar net?

Einzelne Bits kannst du nicht reservieren, da die kleinste adressierbare Einheit 1 Byte ist, aber du kannst die einzelnen Bits der Integers setzen und lesen..!

PS: bitte nicht 2 mal in hintereinander in kurzem Abstand posten sondern die Edit-Funktion benutzen!

_________________
gringo pussy cats - eef i see you i will pull your tail out by eets roots!
UC-Chewie
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 531

WinXP
D5 Ent
BeitragVerfasst: Mo 31.01.05 11:33 
Außerdem ist es unwahrscheinlich (denke ich, weiß ja nicht, was du modellieren willst), dass jedes Feld deiner Matrix belegt sein wird. Ich würde mir Gedanken machen, wie ich meine Daten anders darstellen kann (z.b. irgendeine Art verkettetes Gitter mit Entfernungsangabe oder so).

_________________
Egal wie dumm man selbst ist, es gibt immer andere, die noch dümmer sind
Lossy eX
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1048
Erhaltene Danke: 4



BeitragVerfasst: Mo 31.01.05 12:20 
Das denke ich allerdings mal. Evtl wäre es gar nicht mal schlecht, wenn du uns genau erklären würdest was du damit vor hast? Vielleicht gibt es ja eine recht einfach Lösung für dein Problem. Ich denke nämlich mal nicht, dass du vor hast den gesammten Speicher zu belegen. Sondern eher nur ein Struktur zu haben in der du etwas ablegen und schnell drauf zugreifen kann, oder? Ist aber nur ne Vermutung.

_________________
Nur die Menschheit ist arrogant genug, um zu glauben sie sei die einzige intelligente Lebensform im All. Wo nicht mal das nachhaltig bewiesen wurde.
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: Mo 31.01.05 13:59 
Für TFileStream siehe bitte in den Tuts.

Grundlegend:
Um auf das Element A[X,Y,Z] zuzugreifen, muss man auf die Adresse
FS.Position := SizeOf(Grundtyp) * (Z + NumberOfElementsZ * (Y + NumberOfElementsY * X)); zugreifen.

_________________
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.
tommie-lie
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 4373

Ubuntu 7.10 "Gutsy Gibbon"

BeitragVerfasst: Mo 31.01.05 15:27 
FabianS hat folgendes geschrieben:
nutze, komme ich noch auf rund 120 MB RAM. hab aber nur 64MB ^^
Das eine hat seit rund 15 Jahren mit dem anderen nichts mehr zu tun, dein Adressbereich umfasst 4GB, von dem dir unter Windows 2GB zur Verfügung stehen, egal wieviel RAM du hast. Das, was in den physischen Speicher nicht reinpasst, wird ausgelagert und landet in der pagefile.swp (unter Win98 hieß sie anders, ich meine irgendwas mit 386 im Namen, kann mich aber nicht mehr erinnern).
Wenn du Manuels Methode nachgehst, brauchst du "nur" 125MB Speicher, bei ausreichend groß konfiguriertem Pagefile klappt das wunderbar (wenn auch entsprechend langsam, weil die Festplatte nicht so schnell ist wie der RAM). Bens Methode ist faktisch Paging, nur daß du dich selbst drum kümmern musst. 4GB kriegst du unter Win98SE aber damit auch nicht hin, denn eine Datei, die 2GB groß ist, wirst du mit FAT und FAT32 vergeblich versuchen, anzulegen ;-)

Zu Manuels Methode:
Die Umsetzung kannst du mit der logischen Operation and machen. Die nimmt als Operanden zwei Masken (in Form von ordinalen Werten) an und gibt dir eine AND-Verknüpfung zurück. Wenn du nun gegen ein Muster prüfst, bei dem nur ein einziges Bit gesetzt ist, kannst du anschließend Prüfen, ob die zurückgegebene Verknüpfung 0 ist, oder nicht. In ersterem Fall ist das Bit nicht gesetzt, in letzterem Fall schon.

_________________
Your computer is designed to become slower and more unreliable over time, so you have to upgrade. But if you'd like some false hope, I can tell you how to defragment your disk. - Dilbert
Motzi
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2931

XP Prof, Vista Business
D6, D2k5-D2k7 je Prof
BeitragVerfasst: Mo 31.01.05 19:35 
tommie-lie hat folgendes geschrieben:
Wenn du Manuels Methode nachgehst, brauchst du "nur" 125MB Speicher

Falsch... 32^3 * 4 = 131072 = 128kb - ist also sehr human vom Speicherverbrauch her! ;)

_________________
gringo pussy cats - eef i see you i will pull your tail out by eets roots!
tommie-lie
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 4373

Ubuntu 7.10 "Gutsy Gibbon"

BeitragVerfasst: Mo 31.01.05 19:45 
Motzi hat folgendes geschrieben:
tommie-lie hat folgendes geschrieben:
Wenn du Manuels Methode nachgehst, brauchst du "nur" 125MB Speicher
Falsch... 32^3 * 4 = 131072 = 128kb - ist also sehr human vom Speicherverbrauch her! ;)
Er will 1024^3 Elemente speichern, sind also 1 Milliarde (1073741824) Werte, die alle in einem einzigen Bit dargestellt werden können. Also haben wir 1Mrd / 8 Byte = 134217728, und das sind 128 Megabyte (call it MibiByte, wenn du willst :puke:).

_________________
Your computer is designed to become slower and more unreliable over time, so you have to upgrade. But if you'd like some false hope, I can tell you how to defragment your disk. - Dilbert
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: Mo 31.01.05 20:24 
tommie-lie hat folgendes geschrieben:
Bens Methode ist faktisch Paging, nur daß du dich selbst drum kümmern musst. 4GB kriegst du unter Win98SE aber damit auch nicht hin, denn eine Datei, die 2GB groß ist, wirst du mit FAT und FAT32 vergeblich versuchen, anzulegen ;-)

Jip. wenn man's richtig proggt, ist die Speichergröße aber praktisch nur noch vom Festplattenplatz abhängig. Dazu muss man dieses Paging aber entsprechend in mehrere Files aufteilen, wass man sowieso machen sollte. Außerdem bietet sich in dem Zusammenhang die Verwendung von MMFs an, da dann das lästige Seeken in der Datei von Windows erledigt wird.

_________________
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.
tommie-lie
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 4373

Ubuntu 7.10 "Gutsy Gibbon"

BeitragVerfasst: Mo 31.01.05 20:55 
BenBE hat folgendes geschrieben:
Jip. wenn man's richtig proggt, ist die Speichergröße aber praktisch nur noch vom Festplattenplatz abhängig.
Ist es beim Windows-Paging auch. Nur frage ich mich gerade, was Windows macht, wenn die Paging-Datei größer als 2GB wird... logisch wäre es, eine zweite Datei zu erzeugen, aber ob Microsoft das auch als logisch empfunden hat? :gruebel:

_________________
Your computer is designed to become slower and more unreliable over time, so you have to upgrade. But if you'd like some false hope, I can tell you how to defragment your disk. - Dilbert
Motzi
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2931

XP Prof, Vista Business
D6, D2k5-D2k7 je Prof
BeitragVerfasst: Mo 31.01.05 21:14 
tommie-lie hat folgendes geschrieben:
Nur frage ich mich gerade, was Windows macht, wenn die Paging-Datei größer als 2GB wird...

Ähm.. wie willst du denn eine 2GB große MMF erzeugen..? Die MMF wird ja schließlich in den Adressraum gemappt und da hast du bekanntlich nur Zugriff auf 2GB... :gruebel:

_________________
gringo pussy cats - eef i see you i will pull your tail out by eets roots!