Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Eine Frage zu dynamischen Arrays (https://www.delphipraxis.net/59860-eine-frage-zu-dynamischen-arrays.html)

behbeh 29. Dez 2005 17:37


Eine Frage zu dynamischen Arrays
 
Hallo,
ich habe da ein kleines(?) Problem.
Ich muss eine vorhandene Datei öffnen, die Beschreibung zum Dateiformat ist vorhanden, also wo und wie welcher Wert abgelegt ist.
Das einlesen klappt auch prima. In dem Header der Datei steht am Schluss aus wievielen Samples die eigendlichen Daten bestehen.( Das ist abhängig davon, wie man das ErzeugerProgramm eingestellt hat.
Ich habe mir zum Einlesen ein Record definiert mit einer festgelegten Grösse fuer das Daten-Array(20000 Werte im DoubleFormat).
Meine Frage ist, wie kann ich ein Array definieren, das Dynamisch erst dann die Groesse einstellt, wenn ich die Anzahl der Samples aus dem Header eingelesen habe. Geht das ueberhaupt?
Ich habe es schon mit TFileStream probiert und dabei den Datenbereich dynamisch deklariert, nur bekomme ich keine Daten mehr.
Kann mir da jemand helfen?
Vielen Dank
Bernd

dahead 29. Dez 2005 17:41

Re: Eine Frage zu dynamischen Arrays
 
Die Größe eines dyn. Arrays kannst du mit SetLength festlegen (siehe Delphi Hilfe).

behbeh 29. Dez 2005 18:38

Re: Eine Frage zu dynamischen Arrays
 
Ja, das habe ich ja gemacht. Aber ich habe einen fehler gemacht.
Das Array ist leer wenn ich es benutzte!
Bernd

dahead 29. Dez 2005 18:44

Re: Eine Frage zu dynamischen Arrays
 
Tja, das kann mehrere Gründe haben.

Welche "Länge" hast du angegeben? Evtl. ist die Variable die du übergibst ja 0. Ich kann aber ohne Code nur raten.

Evtl. willst du ja ein kleines Stück posten, dann könnte ich (und andere) dir besser helfen.

behbeh 29. Dez 2005 19:09

Re: Eine Frage zu dynamischen Arrays
 
kein Problem:
so geht es:

Delphi-Quellcode:
Tdaten     = Array[0..19999] of double;
aber nicht hiermit
Delphi-Quellcode:
//Tdaten     = Array of double;

Delphi-Quellcode:
Type TTOF = record
     tgeneralset            : Tgeneral;
     Protocol : Array[0..15] of TProtocolFile;
     TOF_ID                 : TOF_RECORD;
     NumberofPoints         : longint;// 4
     Tdata                  : Tdaten;
    end;

so geht es:
Delphi-Quellcode:
//setlength(in_file.Tdata,20000);
    Stream.ReadBuffer(in_file, SizeOf(in_file));
dann stehen in in_file.Tdata[index] was drin, sonst nicht

Bernd

[edit=Christian Seehase]Delphi-Tags gesetzt. Bitte künftig selber machen. Danke. Mfg, Christian Seehase[/edit]

tomsel 29. Dez 2005 19:16

Re: Eine Frage zu dynamischen Arrays
 
sieh dir doch das nochmal genauer an:

Zitat:

Stream.ReadBuffer(in_file, SizeOf(in_file));
Wohin und wieviel wird hier gelesen?

behbeh 29. Dez 2005 19:37

Re: Eine Frage zu dynamischen Arrays
 
sieh dir doch das nochmal genauer an:

Zitat:

Stream.ReadBuffer(in_file, SizeOf(in_file));
Wohin und wieviel wird hier gelesen?

Die Daten, die z.B. im in_file.NumberofPoints stehen, sind richtig. Auch die anderen in diesem record. Nur beim dynamische Array haengt sich das programm auf.

label1.Caption:=inttostr(in_file.tgeneralset.Proto colNum);
label2.Caption:=floattostr(in_file.Protocol[in_file.tgeneralset.ProtocolNum].RecordLength)+' µs';
label5.Caption:=inttostr (in_file.Protocol[in_file.tgeneralset.ProtocolNum].SamplingInterval);
wird alles richtig angezeigt...
Gruss Bernd

Flocke 29. Dez 2005 19:47

Re: Eine Frage zu dynamischen Arrays
 
Ein "Array of Double" ist einfach ein Zeiger der mit dynamischem Speicher belegt wird. Du musst in zwei "Häppchen" lesen:
1. Die Struktur OHNE das Array
2. Das Array selbst

Etwa so (aus dem Kopf)
Delphi-Quellcode:
Stream.ReadBuffer(in_file, SizeOf(in_file) - SizeOf(in_file.Tdata));
SetLength(in_file.Tdata, in_file.NumberofPoints);
Stream.ReadBuffer(in_file.Tdata[0], in_file.NumberofPoints * SizeOf(in_file.Tdata[0]));

tomsel 29. Dez 2005 19:53

Re: Eine Frage zu dynamischen Arrays
 
Wenn tDaten als dyn. Array deklariert ist, wird es in deinem Record nur als Zeiger repräsentiert, als statisches Array ist es aber komplett im Record enthalten. Wenn also sizeof(tinfile) Bytes aus der Datei gelesen werden, werden bei der dynamischen Variante zusätzlich zum Header nur 4 Bytes an Daten gelesen. Du musst den Header und die Daten getrennt lesen, etwa so:

Delphi-Quellcode:
 
Stream.ReadBuffer(in_file, SizeOf(in_file) - sizeof(infile.tDaten))); //vermute, sizeof = Größe des Pointers
Stream.ReadBuffer(in_file.tdaten, length(in_file.tdaten));

behbeh 29. Dez 2005 20:15

Re: Eine Frage zu dynamischen Arrays
 
Zitat:

Zitat von Flocke
Ein "Array of Double" ist einfach ein Zeiger der mit dynamischem Speicher belegt wird. Du musst in zwei "Häppchen" lesen:
1. Die Struktur OHNE das Array
2. Das Array selbst

Etwa so (aus dem Kopf)
Delphi-Quellcode:
Stream.ReadBuffer(in_file, SizeOf(in_file) - SizeOf(in_file.Tdata));
SetLength(in_file.Tdata, in_file.NumberofPoints);
Stream.ReadBuffer(in_file.Tdata[0], in_file.NumberofPoints * SizeOf(in_file.Tdata[0]));


JA SUPER, das funktioniert.....
Ich habe mich schon gewundert, wenn diese Hilfe kommt beim schreiben wird angezeigt "^infile.tdata" was ja wohl heisst, das diese Variable ein zeiger ist....
Wenn ich also jetzt 2 datensaetze einlesen will, xdata und ydata(jeweils z.B. 10000 werte ) dann muss ich das dann so machen

SetLength(in_file.Txdata, in_file.NumberofPoints); // Zeitwerte
SetLength(in_file.Tydata, in_file.NumberofPoints); // Messwerte
weil die immer gleich sind, zu jeder Zeit gehört ein Messwert

Stream.ReadBuffer(in_file.Txdata[0], in_file.NumberofPoints * SizeOf(in_file.Txdata[0]));
^^^^Groesse des Arrays
Stream.ReadBuffer(in_file.Tydata[0], in_file.NumberofPoints * SizeOf(in_file.Tydata[0]));
^Zeiger auf den Anfang?? des Arrays

Vielen vielen dank....
Bernd


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:08 Uhr.
Seite 1 von 2  1 2      

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