AGB  ·  Datenschutz  ·  Impressum  







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

Werte aus dynamischen array löschen

Ein Thema von jupiter4065139 · begonnen am 19. Jun 2013 · letzter Beitrag vom 20. Jun 2013
Antwort Antwort
Seite 1 von 3  1 23      
jupiter4065139

Registriert seit: 22. Mär 2013
23 Beiträge
 
#1

Werte aus dynamischen array löschen

  Alt 19. Jun 2013, 17:11
Hallo,

ich hab mir meine Werte aus einem stream in ein array eingelesen

Delphi-Quellcode:
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;
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.
Delphi-Quellcode:
               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;
kann da jemand ein tipp geben?

Geändert von jupiter4065139 (19. Jun 2013 um 17:33 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von baumina
baumina

Registriert seit: 5. Mai 2008
Ort: Oberschwaben
1.275 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: Werte aus dynamischen array löschen

  Alt 19. Jun 2013, 17:57
http://www.delphi-treff.de/tipps/obj...ecke-entsteht/
Hinter dir gehts abwärts und vor dir steil bergauf ! (Wolfgang Ambros)
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.453 Beiträge
 
Delphi 12 Athens
 
#3

AW: Werte aus dynamischen array löschen

  Alt 19. Jun 2013, 18:03
Tip: Wenn du über eine for-Schleife Elemente aus einem Array löscht, dann lass die Schleife rückwärts laufen.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von BUG
BUG

Registriert seit: 4. Dez 2003
Ort: Cottbus
2.094 Beiträge
 
#4

AW: Werte aus dynamischen array löschen

  Alt 19. Jun 2013, 23:21
Ich würde eher an sowas denken:
Delphi-Quellcode:
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);
Also insgesamt: Die Elemente, die du behalten willst, am Anfang des Arrays anordnen.
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.
Intellekt ist das Verstehen von Wissen. Verstehen ist der wahre Pfad zu Einsicht. Einsicht ist der Schlüssel zu allem.

Geändert von BUG (19. Jun 2013 um 23:24 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Bummi
Bummi

Registriert seit: 15. Jun 2010
Ort: Augsburg Bayern Süddeutschland
3.470 Beiträge
 
Delphi XE3 Enterprise
 
#5

AW: Werte aus dynamischen array löschen

  Alt 19. Jun 2013, 23:28
Thomas Wassermann H₂♂
Das Problem steckt meistens zwischen den Ohren
DRY DRY KISS
H₂ (wenn bei meinen Snipplets nichts anderes angegeben ist Lizenz: WTFPL)
  Mit Zitat antworten Zitat
Benutzerbild von BUG
BUG

Registriert seit: 4. Dez 2003
Ort: Cottbus
2.094 Beiträge
 
#6

AW: Werte aus dynamischen array löschen

  Alt 19. Jun 2013, 23:46
Möchte jupiter nicht mehrere Zeilen löschen, bei denen eine bestimmte Bedingung zutrifft
Intellekt ist das Verstehen von Wissen. Verstehen ist der wahre Pfad zu Einsicht. Einsicht ist der Schlüssel zu allem.
  Mit Zitat antworten Zitat
Benutzerbild von Bummi
Bummi

Registriert seit: 15. Jun 2010
Ort: Augsburg Bayern Süddeutschland
3.470 Beiträge
 
Delphi XE3 Enterprise
 
#7

AW: Werte aus dynamischen array löschen

  Alt 19. Jun 2013, 23:54
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:
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);
Thomas Wassermann H₂♂
Das Problem steckt meistens zwischen den Ohren
DRY DRY KISS
H₂ (wenn bei meinen Snipplets nichts anderes angegeben ist Lizenz: WTFPL)
  Mit Zitat antworten Zitat
Benutzerbild von BUG
BUG

Registriert seit: 4. Dez 2003
Ort: Cottbus
2.094 Beiträge
 
#8

AW: Werte aus dynamischen array löschen

  Alt 20. Jun 2013, 00:22
Wenn Condition invers gemeint ist fehlt IMHO ein else Zweig
OK, stimmt ... das ist verwirrend: condition(element) soll true sein, wenn element im Array behalten werden soll.
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:
         [0 1 2 3 4]
readPos   0
writePos  0
retained 0
Vor 2. Schleifendurchlauf:
Code:
         [0 1 2 3 4]
readPos     1
writePos    1
retained   1
Vor 3. Schleifendurchlauf:
Code:
         [0 1 2 3 4]
readPos       2
writePos    1
retained    1
Vor 4. Schleifendurchlauf:
Code:
         [0 2 2 3 4]
readPos         3
writePos      2
retained     2
Vor 5. Schleifendurchlauf:
Code:
         [0 2 2 3 4]
readPos           4
writePos      2
retained     2
Ende der Schleife:
Code:
         [0 2 4|3 4]
readPos?       |
writePos       |3
retained       3

setLength(aArray, retained) => [0 2 4]
Dabei fällt mir auf, dass writePos und retained immer gleich sind; man könnte sich also eine der Variablen sparen
Intellekt ist das Verstehen von Wissen. Verstehen ist der wahre Pfad zu Einsicht. Einsicht ist der Schlüssel zu allem.

Geändert von BUG (20. Jun 2013 um 00:25 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Bummi
Bummi

Registriert seit: 15. Jun 2010
Ort: Augsburg Bayern Süddeutschland
3.470 Beiträge
 
Delphi XE3 Enterprise
 
#9

AW: Werte aus dynamischen array löschen

  Alt 20. Jun 2013, 07:18
versuch es mal mit einem Array von 0 bis 9 und der Bedingung
if ((aArray[readPos]))=5 then Mit einem kleinen Umbau sollte es funktionieren

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;
Thomas Wassermann H₂♂
Das Problem steckt meistens zwischen den Ohren
DRY DRY KISS
H₂ (wenn bei meinen Snipplets nichts anderes angegeben ist Lizenz: WTFPL)

Geändert von Bummi (20. Jun 2013 um 07:45 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von BUG
BUG

Registriert seit: 4. Dez 2003
Ort: Cottbus
2.094 Beiträge
 
#10

AW: Werte aus dynamischen array löschen

  Alt 20. Jun 2013, 08:36
versuch es mal mit einem Array von 0 bis 9 und der Bedingung if ((aArray[readPos]))=5 then
Heraus kommt (wie erwartet) das Array [5].

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:
  • in der Bedeutung von condition(aArray) ,
  • der Zählrichtung von retained ,
  • darin, dass du writePos immer inkrementierst, aber im Falle des Löschens eines Elements vorher dekrementierst.
Intellekt ist das Verstehen von Wissen. Verstehen ist der wahre Pfad zu Einsicht. Einsicht ist der Schlüssel zu allem.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


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 12:51 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