![]() |
AW: Werte aus dynamischen array löschen
:wall::wall: Danke ... mein Verständnis von condition war der Anlass für den Hänger ...
|
AW: Werte aus dynamischen array löschen
ich hab das mal probiert nach
![]()
Delphi-Quellcode:
Da werden aber in den Bereich nur "0" geschrieben. Das Problem liegt IMHO daran das fs.position als byte deklariert sind, oder? Die Daten aus der Datei werden als smallint ausgelesen, d.h. wenn ich mir fs.position anzeigen lasse wird immer um 2 byte erhöht.
If (median[FS.Position].Zeit > 0.1 and median[FS.Position].Zeit < 0.2) then
begin move(median[fs.position+1], median[fs.position], sizeOf(median[0])*(Length(median) - fs.position - 1)); setlength(median, length(median)-1); end; Wenn ich jetzt fs.position als Index nehme geht das denk ich nich. Wie mach ich denn das dann am besten? |
AW: Werte aus dynamischen array löschen
Deswegen kam dieser Hinweis:
Zitat:
|
AW: Werte aus dynamischen array löschen
Delphi-Quellcode:
If median[FS.Position].Zeit < 0.2) and (median[FS.Position].Zeit > 0.1 then
meinst du so? Da ändert sich aber nichts. kommen trotzdem nur "0". |
AW: Werte aus dynamischen array löschen
Zitat:
|
AW: Werte aus dynamischen array löschen
Deine If-Abfrage befindet sich sicherlich innerhalb irgendeiner Schleife (while/repeat/for), diese solltest du Rückwärts laufen lassen.
|
AW: Werte aus dynamischen array löschen
sorry, ich bin noch blutiger Anfänger (war etwas daneben)
Delphi-Quellcode:
sowas dann ungefähr
while Stream.Position < Stream.Size do begin
Stream.ReadBuffer(Digit, SizeOf(Digit)); Inc(byte); time:= time+ 1/250; setlength(arr,stream.size); arr[stream.position].zeit:= time; arr[stream.position].wert:=Digit; If (arr[stream.Position].Zeit > 0.1 and arr[stream.Position].Zeit < 0.2) then begin move(arr[stream.position+1], arr[stream.position], sizeOf(arr[0])*(Length(arrn) - stream.position - 1)); setlength(arr, length(arr)-1); end; end;
Delphi-Quellcode:
wie mach ich denn dann das, ich müsste ja die stream.position an das ende setzen
while Stream.Position < Stream.Size do begin
Stream.ReadBuffer(Digit, SizeOf(Digit)); dec(byte); |
AW: Werte aus dynamischen array löschen
Vielleicht solltest du nicht darüber nachdenken überflüssige Einträge aus dem Array heraus zu löschen, sondern lieber unerwünschte Einträge in das Array erst gar nicht hinein zu schreiben. Ungefähr so:
Delphi-Quellcode:
ungetestet
setlength(arr,0);
while Stream.Position < Stream.Size do begin Stream.ReadBuffer(Digit, SizeOf(Digit)); Inc(byte); time:= time+ 1/250; If (time <= 0.1) or (time >= 0.2) then begin setlength(arr,Length(arr) + 1); arr[Length(arr)].zeit:= time; arr[Length(arr)].wert:= Digit; end; end; |
AW: Werte aus dynamischen array löschen
Da ist schon mal ein grundsätzlicher Fehler: du indizierst das Array nach der Stream.Position. Die ist aber immer Byte-orientiert und würde nur dann Sinn machen, wenn Digit auch als Byte deklariert ist. Sollte das aber der Fall sein, dann ist in jedem Fall des SetSize innerhalb der while-Schleife falsch und effizienter würde man das Array in einem Rutsch aus dem Stream füllen und danach weiter bearbeiten.
Also zeig doch bitte mal noch mehr von deinem Code. Übrigens: Byte ist ein vordefinierter Datentyp. Delphi lässt zwar die Deklaration einer Variablen dieses Namens zu und behandelt das i.A. auch korrekt, es ist aber kein guter Stil solche Namen zu vergeben. |
AW: Werte aus dynamischen array löschen
Zitat:
Delphi-Quellcode:
type
TDatensatz = record Zeit:Extended; U:Extended; end; TDatenarray = array of TDatensatz ; arr:TDatenarray; var j:byte; x, bis:integer; digit:smallint; Stream,Stream2:TFilestream; time, spannung:extended; Listen:String; begin try j := 0; time:=0; while stream.Position < stream.Size do begin stream.ReadBuffer(Digit, SizeOf(Digit)); inc(j); Spannung:= 10 * digit / 32768; time:=time+1/250; setlength(arr, fs.size); arr[stream.Position].Zeit:=time; arr[stream.position].U:=Spannung; for x:= 0 to bis DO //bis wird über inputbox gelesen Begin if arr[stream.position].zeit > 0.1*x and arr[stream.position].zeit < 0.2*x then //die Bedingung sieht eigentlich anders aus, aber so in der art begin // den Bereich wollte ich jetzt löschen move(arr[stream.position+1], arr[stream.position], sizeof(arr[0])*(length(arr) -stream.position-1)); setlength(arr, length(arr)+1); end; end; //ab hier in einen 2.stream speichern Listen := floattostr(arr[stream.position].zeit) + #9 + FloatToStr(arr[stream.position].U) + #9 + #13#10; //AK Stream2.WriteBuffer(Listen[1], Listen(string)); Listen := ''; j := 0; end; end; finally stream.Free; stream2.Free; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:27 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