![]() |
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 |
Re: Eine Frage zu dynamischen Arrays
Die Größe eines dyn. Arrays kannst du mit SetLength festlegen (siehe Delphi Hilfe).
|
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 |
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. |
Re: Eine Frage zu dynamischen Arrays
kein Problem:
so geht es:
Delphi-Quellcode:
aber nicht hiermit
Tdaten = Array[0..19999] of double;
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:
dann stehen in in_file.Tdata[index] was drin, sonst nicht
//setlength(in_file.Tdata,20000);
Stream.ReadBuffer(in_file, SizeOf(in_file)); Bernd [edit=Christian Seehase]Delphi-Tags gesetzt. Bitte künftig selber machen. Danke. Mfg, Christian Seehase[/edit] |
Re: Eine Frage zu dynamischen Arrays
sieh dir doch das nochmal genauer an:
Zitat:
|
Re: Eine Frage zu dynamischen Arrays
sieh dir doch das nochmal genauer an:
Zitat:
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 |
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])); |
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)); |
Re: Eine Frage zu dynamischen Arrays
Zitat:
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. |
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