AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Dynamisches Array speichern und einlesen

Offene Frage von "mytar"
Ein Thema von Jelly · begonnen am 22. Dez 2004 · letzter Beitrag vom 4. Jan 2005
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von Jelly
Jelly

Registriert seit: 11. Apr 2003
Ort: Moestroff (Luxemburg)
3.741 Beiträge
 
Delphi 2007 Professional
 
#1

Dynamisches Array speichern und einlesen

  Alt 22. Dez 2004, 10:56
Ich muss ein dynamisches Array speichern, und natürlich auch wieder einlesen.

Bei einem Statischen Array klappt das Speichern mit diesem Code:
Delphi-Quellcode:
var
  A : array[0..99,0..99,0..99] of double ;
begin
     FS := TFileStream.Create(txtfilename.text,fmCreate);
     try
        FS.Write (A,sizeof(A)) ;
     finally
        FS.free ;
     end ;
end ;
Bei einem dynamischen Array versagt die Routine aber. Worauf muss ich da achten?
  Mit Zitat antworten Zitat
Robert_G
(Gast)

n/a Beiträge
 
#2

Re: Dynamisches Array speichern und einlesen

  Alt 22. Dez 2004, 11:37
Zitat von Jelly:
Bei einem dynamischen Array versagt die Routine aber. Worauf muss ich da achten?
Sie versagt, weil SizeOf 4 ergibt (misst nur die Größe des Zeigers )
Die Frage ist: Willst du überhaupt ein normales Array nehmen?
Wäre maximovs Template version der dpCollectiondpCollection nicht um ein Vielfaches besser?
  Mit Zitat antworten Zitat
Benutzerbild von Jelly
Jelly

Registriert seit: 11. Apr 2003
Ort: Moestroff (Luxemburg)
3.741 Beiträge
 
Delphi 2007 Professional
 
#3

Re: Dynamisches Array speichern und einlesen

  Alt 22. Dez 2004, 12:57
Ich habs jetzt irgendwie so hingekriegt:
Delphi-Quellcode:
     FS := TFileStream.Create(txtfilename.text,fmCreate);
     try
        FS.Write(N,sizeof(N)) ;
        for x := 0 to N-1 do
        for y := 0 to N-1 do
           for z := 0 to N-1 do begin
              FS.Write(A[x,y,z],SizeOf(TRecord))
           end ;
     finally
        FS.free ;
     end ;
Das klappt soweit. Auslesen halt analog.

Die Sache mit der Collection wäre auch ne Möglichkeit, allerdings hab ich jetzt schon die ganzen Daten in Arrays vorliegen, und die Zeit fehlt mir das zu ändern.
  Mit Zitat antworten Zitat
Chewie

Registriert seit: 10. Jun 2002
Ort: Deidesheim
2.886 Beiträge
 
Turbo Delphi für Win32
 
#4

Re: Dynamisches Array speichern und einlesen

  Alt 22. Dez 2004, 13:24
Du musst deinen Code nur minimal abändern:

Code:
var
  A : array[0..99,0..99,0..99] of double ;
begin
     FS := TFileStream.Create(txtfilename.text,fmCreate);
     try
        FS.Write (A[b][0][/b], [b]length(A) * sizeof(A[0][/b]) ;
     finally
        FS.free ;
     end ;
end ;
Grund: dynamische Array-Variablen sind nur Zeiger auf das Array. TFileStream.Write verlangt aber keine Adresse, sondern ein Datum, und das lieferst du mit A[0]. Und die Größe des Arrays im Speicher ist die Anzahl der Elemente mal der Größe eines Elements.
Martin Leim
Egal wie dumm man selbst ist, es gibt immer andere, die noch dümmer sind
  Mit Zitat antworten Zitat
MaWi3.2

Registriert seit: 28. Dez 2004
Ort: Ilmenau
18 Beiträge
 
#5

Re: Dynamisches Array speichern und einlesen

  Alt 2. Jan 2005, 16:22
Also erstmal zu dem :
length(A) * sizeof(A[0]
bei einem 10 mal 10 array ergibt das 40 und keine hundert...
hab ich da was falsch verstanden??

Und kann mir das nochmal jemand erklären ich habe nämlich das gleiche Problem nur bei mir funktioniert das ganze ganz und gar nicht....
Wenn ich mein dyn. Array Speicher speichert er das nicht vollständig ab und das lesen klappt dann gar nicht.


Das wäre meine Procedure zum Laden:
Delphi-Quellcode:
procedure TForm1.LadenClick(Sender: TObject);
var FS : TFileStream;
    svMatrix : array of array of integer;
begin
if OpenDialog1.Execute then
begin
     FS := TFileStream.Create(OpenDialog1.FileName,fmOpenRead);
     try
        FS.Read (svMatrix[0], length(svMatrix) * sizeof(svMatrix[0]) ;
     finally
        FS.free ;
     end ;
end;
end;

und das zum Speichern....
Delphi-Quellcode:
procedure TForm1.SpeichernClick(Sender: TObject);
var FS : TFileStream;
    svMatrix : array of array of integer;
begin
if SaveDialog1.Execute then
begin
     FS := TFileStream.Create(SaveDialog1.FileName,fmCreate);
     try
        FS.Write (svMatrix[0], length(svMatrix) * sizeof(svMatrix[0]) ;
     finally
        FS.free ;
     end ;
end;
end;
Habe das mit ner einfachen for Schleife bei mir mit Werten belegt aber beim einlesen kommt nix.
Was mache ich falsch?
  Mit Zitat antworten Zitat
Chewie

Registriert seit: 10. Jun 2002
Ort: Deidesheim
2.886 Beiträge
 
Turbo Delphi für Win32
 
#6

Re: Dynamisches Array speichern und einlesen

  Alt 2. Jan 2005, 17:40
Dynamische Arrays sind erstmal Zeiger. Ein 10 mal 10 Array ist also eine Liste von 10 Zeigern auf andere Speicherbereche. Du hast keinen zusammengehörigen Speicherbereich, deshalb musst du alles auf eindimensionale Arrays zurückführen und die einzeln abspeichern.
Martin Leim
Egal wie dumm man selbst ist, es gibt immer andere, die noch dümmer sind
  Mit Zitat antworten Zitat
MaWi3.2

Registriert seit: 28. Dez 2004
Ort: Ilmenau
18 Beiträge
 
#7

Re: Dynamisches Array speichern und einlesen

  Alt 2. Jan 2005, 19:00
Und warum funktioniert dann der mein Code nicht?
  Mit Zitat antworten Zitat
Chewie

Registriert seit: 10. Jun 2002
Ort: Deidesheim
2.886 Beiträge
 
Turbo Delphi für Win32
 
#8

Re: Dynamisches Array speichern und einlesen

  Alt 3. Jan 2005, 10:32
Zitat von MaWi3.2:
Und warum funktioniert dann der mein Code nicht?
Dein Code funktioniert schon, nur macht er nicht das was du willst: Er speichert nämlich einfach die Adressen der Speicherbereiche, die deine Integer-Zahlen enthalten.
Martin Leim
Egal wie dumm man selbst ist, es gibt immer andere, die noch dümmer sind
  Mit Zitat antworten Zitat
mytar

Registriert seit: 30. Mai 2004
Ort: Zermatt
411 Beiträge
 
Delphi 6 Enterprise
 
#9

Re: Dynamisches Array speichern und einlesen

  Alt 3. Jan 2005, 10:48
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.

Francis Obikwelu
greetz
mytar
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.105 Beiträge
 
Delphi 11 Alexandria
 
#10

Re: Dynamisches Array speichern und einlesen

  Alt 3. Jan 2005, 11:46
Moin mytar,

Zitat von mytar:
...da ist auf Position 0 ja auch ein Zeiger.
nein, ist er nicht.
Eine Stringvariable (Huge Strings) enthält einen Zeiger auf das erste Zeichen des Strings in den vier Zeichen vor dem ersten Zeichen steht die Länge, und die davor liegen vier Byte enthalten einen Referenzzähler.

Würdest Du nur

fs.Write(StringVariable,...); angeben, würdest Du den Wert des Pointers und die Bytes dahinter schreiben.
Erst

fs.Write(StringVariable[1],...); schreibt den Inhalt des Strings.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:13 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz