Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Dynamisches Array speichern und einlesen (https://www.delphipraxis.net/36590-dynamisches-array-speichern-und-einlesen.html)

mytar 3. Jan 2005 12:00

Re: Dynamisches Array speichern und einlesen
 
Ist hier die Länge 255 als zweiter Write-Parameter verpflichtend?

(Hab ich mal gehört)!

:-D

Christian Seehase 3. Jan 2005 12:23

Re: Dynamisches Array speichern und einlesen
 
Moin Francis,

nein, die Länge kannst Du nach Bedarf angeben.
Ein ShortString hat eine maximle Länge von 255 Zeichen und enthält an der Stelle [0] ein Längenbyte.

Jetzt aber bitte Back To Topic.

Chewie 3. Jan 2005 13:01

Re: Dynamisches Array speichern und einlesen
 
Zitat:

Zitat von mytar
Dass muss aber irgendwie so funktionieren,
dass man dass ganze mit einem Befehl in den Stream schreibt!

Denn bei Strings funktioniert das ja auch,
und da ist auf Position 0 ja auch ein Zeiger.

:-D

Strings sind ja auch eindimensioanle Arrays. Bei denen funktioniert das mit meiner Methode ja auch wunderbar. Warum das bei mehrdimensionalen nicht geht, hab ich weiter oben geschrieben.

Einen Vorschlag hätt ich allerdings: Benutz statische Arrays, schalte die Bereichsüberprüfung ab und verwalte den Speicher selbst. Dann kannst du ganz leicht streamen, da statische Arrays einen zusammenhängenden Speicherblock einnehmen.

MaWi3.2 3. Jan 2005 16:10

Re: Dynamisches Array speichern und einlesen
 
Wie jetzt?
Ich brauche aber dyn. Arrays.
Das heißt ich müßte die Werte des Arrays einzeln in ne Datei schreiben und wieder auslesen?
Das ist aber umständliche.
Geht das wenn ich es ohne Streams sondern mit Asign und writeln mache?

MaWi3.2

Chewie 3. Jan 2005 16:19

Re: Dynamisches Array speichern und einlesen
 
OK, dann halt mit Codebeispielen:

So deklarierst du dein Array:
Delphi-Quellcode:
a: Array[0..0] of Array[0..0] of Integer;
Mittels Delphi-Referenz durchsuchenGetMem reservierst du für dieses Array dann Speicher. Wenn du es vergrößern willst, reservierst du neuen Speicher in der entsprechenden Größe, verschiebst alle Daten in diesen Speicherbereich und gibts den alten via Delphi-Referenz durchsuchenFreeMem frei. Letztendlich hast du so die Speicherverwaltung eines dynamischen Arrays nachgebaut.

Aber: Wenn du ohnehin weißt, dass du ein Array eines Array hast (das ist nicht ganz ein zweidimensionales Array), dann kannst du dir den ganzen Stress sparen, indem du einfach mit einer for-Schleife jedes einzelne Unter-Array speicherst.
Ich will mal gnädig sein ;)

Delphi-Quellcode:
var
  a: Array of Array of Integer;
  fs: TFileStream;
  i: Integer;

//...
  for i := Low(a) to High(a) do
    fs.write(a[i][0], Length(a[i]) * SizeOf(Integer));

MaWi3.2 3. Jan 2005 17:15

Re: Dynamisches Array speichern und einlesen
 
Supi. Dank Dir jetzt hab auch ich es verstanden und es funktioniert auch.
Danke für Deine Mühe und Geduld.

maximov 4. Jan 2005 11:46

Re: Dynamisches Array speichern und einlesen
 
Zitat:

Zitat von Chewie
OK, dann halt mit Codebeispielen:

So deklarierst du dein Array:
Delphi-Quellcode:
a: Array[0..0] of Array[0..0] of Integer;
Mittels Delphi-Referenz durchsuchenGetMem reservierst du für dieses Array dann Speicher. Wenn du es vergrößern willst, reservierst du neuen Speicher in der entsprechenden Größe, verschiebst alle Daten in diesen Speicherbereich und gibts den alten via Delphi-Referenz durchsuchenFreeMem frei. Letztendlich hast du so die Speicherverwaltung eines dynamischen Arrays nachgebaut.
...

Das muss ich nochmal richtig stellen, da dieser trick sehr praktisch ist, aber leider so nicht funktionieren kann. Denn zur adressierung der daten, in mehr als einer dimension, wird auch die max-anzahl benötig, die hier leider immer statisch 1 ist - und somit kann die erste dimension nicht erweitert werden:

addr := y * maxAnzahlX + x wäre zB. eine zweidimensionale addresierung, die hier leider versagt, da der kompiler ja nicht wissen kann, das man hier ein dynamisches array faken will.

Aber mit einer dimension funktioniert dieser trick prima und kann in speziellen fällen sinnvoll sein!

Chewie 4. Jan 2005 11:59

Re: Dynamisches Array speichern und einlesen
 
Hm, maximov ich fürchte du hast Recht :?
Das hab ich nicht bedacht. Man müsste noch eine Möglichkeit finden, dem Programm zur Laufzeut die Größe einer Dimension mitzuteilen. Aber das wäre zuviel des Gefrickels ;)


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:09 Uhr.
Seite 2 von 2     12   

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz