Delphi-PRAXiS

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

Flocke 29. Dez 2005 20:55

Re: Eine Frage zu dynamischen Arrays
 
Wenn erst die 10.000 Zeiten kommen und danach die 10.000 Messwerte: ja.

Ansonsten musst du TDaten umdefinieren zu
Delphi-Quellcode:
type
  TSample = record
    Zeit: double;
    Messwert: double;
  end;
  Tdaten = Array of TSample;
und dann natürlich nur einmal einlesen.

behbeh 8. Jan 2006 11:57

Re: Eine Frage zu dynamischen Arrays
 
Zitat:

Zitat von Flocke
Wenn erst die 10.000 Zeiten kommen und danach die 10.000 Messwerte: ja.

Ja so liegen sie in der datei....
das hat alles so prima geklappt dank euer hilfe. wieder was dazu gelernt. Bin hat nur ein kleiner techniker und progranniere zwar schon sehr lange, aber eben sher einfach, meist nur testprogramme fuer irgend welche geaerte..
Jetzt kommt das naechste progblemm.
Der Datensatz liegt jetzt in einem anderen format vor.. Das Geraet(Fastflight2 von ORTEC) kann noch ein anderes format schreiben.
zuerst kommt wieder general settings, dann die 15 protokoll methoden und dann die daten. jeder datensatz faengt an mit "FFFFFFFF", was ja noch einfach ist ,dann kommen einige beschreibungen zu den datensatz, 16Bit format oder 24 Bit format und dann liegen die daten bei 16bit von 4 abtastwerten als 16 bit wert der reihe nach im speicher und zwar 1.Highbyte, 2.Highbyte,3.Highbyte,4.Highbyte,1.lowbyte,2.lowby te,3.lowbyyte,4.lowbyte, also muss ich 8 byte lesen und jeweils hightbyte und lowbyte zusammenführen..
mal sehen wie ich das hinbekomme.
Danke nochmal fuer die Hilfen :-D :-D
Bernd

Ansonsten musst du TDaten umdefinieren zu
Delphi-Quellcode:
type
  TSample = record
    Zeit: double;
    Messwert: double;
  end;
  Tdaten = Array of TSample;
und dann natürlich nur einmal einlesen.



Alle Zeitangaben in WEZ +1. Es ist jetzt 04:22 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