![]() |
Werte aus dynamischen array löschen
Hallo,
ich hab mir meine Werte aus einem stream in ein array eingelesen
Delphi-Quellcode:
ich wollt mir jetzt ne schleife bauen, worin die Zeitwerte in einem bestimmten Bereich gelöscht werden. Die jeweiligen digit werte sollen aber auch mit gelöscht werden. D.h. die gesamte Zeile soll gelöscht werden.
while Stream.Position < Stream.Size do begin
Stream.ReadBuffer(Digit, SizeOf(Digit)); Inc(byte); time:= time+ 1/250; setlength(arr,stream.size); arr[fs.position].zeit:= time; arr[fs.position].wert:=Digit;
Delphi-Quellcode:
kann da jemand ein tipp geben?
Begin
If (median[FS.Position].Zeit > 0.1 and median[FS.Position].Zeit < 0.2) then begin // hier dachte ich steht der code zum löschen end; end; |
AW: Werte aus dynamischen array löschen
|
AW: Werte aus dynamischen array löschen
Tip: Wenn du über eine for-Schleife Elemente aus einem Array löscht, dann lass die Schleife rückwärts laufen.
|
AW: Werte aus dynamischen array löschen
Ich würde eher an sowas denken:
Delphi-Quellcode:
Also insgesamt: Die Elemente, die du behalten willst, am Anfang des Arrays anordnen.
var aArray: array of Something;
var writePos, readPos, retained: integer; //... writePos := 0; retained := 0; for readPos := 0 to length(aArray)-1 do begin if condition(aArray[readPos]) then begin if (readPos <> writePos) then aArray[writePos] := aArray[readPos]; inc(writePos); inc(retained); end; end; setLength(aArray, retained); Dabei werden möglicherweise unerwünschte überschrieben und erwünschte dupliziert. Dann wird der Rest einfach abgeschnitten (setLength). Das Ganze könnte man eventuell als generische filter-Operation für Arrays verpacken, aber ich bin nicht so fit mit Generics in Delphi. |
AW: Werte aus dynamischen array löschen
:gruebel:
|
AW: Werte aus dynamischen array löschen
Zitat:
|
AW: Werte aus dynamischen array löschen
Ich habe es nicht getestet, aber wenn z.B. Element 5 gelöscht werden soll, würde IMHO Element
0 mit dem Wert von Element 5 überschrieben und das letzte Element z.B. 10 nach dem Durchlauf gelöscht .... writePos und retained beinhalten die selben Werte ... Wenn Condition invers gemeint ist fehlt IMHO ein else Zweig Zitat:
|
AW: Werte aus dynamischen array löschen
Zitat:
Delphi-Quellcode:
soll
condition(element)
Delphi-Quellcode:
sein, wenn
true
Delphi-Quellcode:
im Array behalten werden soll.
element
Mir ist aber nicht klar, was für ein else-Zweig fehlen sollte? Angenommen ich will aus dem Array [0 1 2 3 4] alle geraden Zahlen herausfiltern. Vor 1. Schleifendurchlauf:
Code:
Vor 2. Schleifendurchlauf:
[0 1 2 3 4]
readPos 0 writePos 0 retained 0
Code:
Vor 3. Schleifendurchlauf:
[0 1 2 3 4]
readPos 1 writePos 1 retained 1
Code:
Vor 4. Schleifendurchlauf:
[0 1 2 3 4]
readPos 2 writePos 1 retained 1
Code:
Vor 5. Schleifendurchlauf:
[0 2 2 3 4]
readPos 3 writePos 2 retained 2
Code:
Ende der Schleife:
[0 2 2 3 4]
readPos 4 writePos 2 retained 2
Code:
Dabei fällt mir auf, dass
[0 2 4|3 4]
readPos? | writePos |3 retained 3 setLength(aArray, retained) => [0 2 4]
Delphi-Quellcode:
und
writePos
Delphi-Quellcode:
immer gleich sind; man könnte sich also eine der Variablen sparen :mrgreen:
retained
|
AW: Werte aus dynamischen array löschen
versuch es mal mit einem Array von 0 bis 9 und der Bedingung
Delphi-Quellcode:
Mit einem kleinen Umbau sollte es funktionieren
if ((aArray[readPos]))=5 then
Delphi-Quellcode:
var
aArray: array of Integer; i, writePos, readPos, retained: Integer; Function Condition(i: Integer): Boolean; begin //Result := (i and 1)=0 ; Result := i in [0, 3, 7]; end; begin writePos := 0; retained := 0; setlength(aArray, 10); For i := 0 to 9 do aArray[i] := i; retained := Length(aArray); for readPos := 0 to Length(aArray) - 1 do begin if Condition(aArray[readPos]) then begin dec(retained); dec(writePos); end else aArray[writePos] := aArray[readPos]; inc(writePos); end; setlength(aArray, retained); end; |
AW: Werte aus dynamischen array löschen
Zitat:
Delphi-Quellcode:
var
aArray: array of Integer; i, writePos, readPos, retained: Integer; Function retainElement(i: Integer): Boolean; begin //Result := (i and 1)=0 ; //Result := i in [0, 3, 7]; Result := i = 5; end; procedure print(a: array of integer); var i: integer; begin for i := 0 to length(a)-1 do WriteLn(a[i]); end; begin writePos := 0; retained := 0; setlength(aArray, 10); For i := 0 to 9 do aArray[i] := i; writePos := 0; retained := 0; for readPos := 0 to length(aArray)-1 do begin if retainElement(aArray[readPos]) then begin if (readPos <> writePos) then aArray[writePos] := aArray[readPos]; inc(writePos); inc(retained); end; end; setLength(aArray, retained); print(aArray); readln; end. Unser Code unterscheidet sich nur:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:21 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