AGB  ·  Datenschutz  ·  Impressum  







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

Eine Frage zu dynamischen Arrays

Ein Thema von behbeh · begonnen am 29. Dez 2005 · letzter Beitrag vom 8. Jan 2006
Antwort Antwort
Seite 1 von 2  1 2      
behbeh

Registriert seit: 29. Dez 2005
Ort: Ochtrup
10 Beiträge
 
Delphi 7 Personal
 
#1

Eine Frage zu dynamischen Arrays

  Alt 29. Dez 2005, 17:37
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
Bernd
  Mit Zitat antworten Zitat
Benutzerbild von dahead
dahead

Registriert seit: 16. Mai 2005
620 Beiträge
 
#2

Re: Eine Frage zu dynamischen Arrays

  Alt 29. Dez 2005, 17:41
Die Größe eines dyn. Arrays kannst du mit SetLength festlegen (siehe Delphi Hilfe).
  Mit Zitat antworten Zitat
behbeh

Registriert seit: 29. Dez 2005
Ort: Ochtrup
10 Beiträge
 
Delphi 7 Personal
 
#3

Re: Eine Frage zu dynamischen Arrays

  Alt 29. Dez 2005, 18:38
Ja, das habe ich ja gemacht. Aber ich habe einen fehler gemacht.
Das Array ist leer wenn ich es benutzte!
Bernd
Bernd
  Mit Zitat antworten Zitat
Benutzerbild von dahead
dahead

Registriert seit: 16. Mai 2005
620 Beiträge
 
#4

Re: Eine Frage zu dynamischen Arrays

  Alt 29. Dez 2005, 18:44
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.
  Mit Zitat antworten Zitat
behbeh

Registriert seit: 29. Dez 2005
Ort: Ochtrup
10 Beiträge
 
Delphi 7 Personal
 
#5

Re: Eine Frage zu dynamischen Arrays

  Alt 29. Dez 2005, 19:09
kein Problem:
so geht es:

Tdaten = Array[0..19999] of double; aber nicht hiermit
//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]
Bernd
  Mit Zitat antworten Zitat
Benutzerbild von tomsel
tomsel

Registriert seit: 8. Dez 2005
Ort: am Chiemsee
304 Beiträge
 
Delphi 7 Professional
 
#6

Re: Eine Frage zu dynamischen Arrays

  Alt 29. Dez 2005, 19:16
sieh dir doch das nochmal genauer an:

Zitat:
Stream.ReadBuffer(in_file, SizeOf(in_file));
Wohin und wieviel wird hier gelesen?
Ein Experte ist ein Mann, der hinterher genau sagen kann, warum seine Prognose nicht gestimmt hat. (Winston Churchill)
  Mit Zitat antworten Zitat
behbeh

Registriert seit: 29. Dez 2005
Ort: Ochtrup
10 Beiträge
 
Delphi 7 Personal
 
#7

Re: Eine Frage zu dynamischen Arrays

  Alt 29. Dez 2005, 19:37
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
Bernd
  Mit Zitat antworten Zitat
Benutzerbild von Flocke
Flocke

Registriert seit: 9. Jun 2005
Ort: Unna
1.172 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#8

Re: Eine Frage zu dynamischen Arrays

  Alt 29. Dez 2005, 19:47
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]));
Volker
Besucht meine Garage
Aktuell: RtfLabel 1.3d, PrintToFile 1.4
  Mit Zitat antworten Zitat
Benutzerbild von tomsel
tomsel

Registriert seit: 8. Dez 2005
Ort: am Chiemsee
304 Beiträge
 
Delphi 7 Professional
 
#9

Re: Eine Frage zu dynamischen Arrays

  Alt 29. Dez 2005, 19:53
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));
Ein Experte ist ein Mann, der hinterher genau sagen kann, warum seine Prognose nicht gestimmt hat. (Winston Churchill)
  Mit Zitat antworten Zitat
behbeh

Registriert seit: 29. Dez 2005
Ort: Ochtrup
10 Beiträge
 
Delphi 7 Personal
 
#10

Re: Eine Frage zu dynamischen Arrays

  Alt 29. Dez 2005, 20:15
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
Bernd
  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 13:44 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