AGB  ·  Datenschutz  ·  Impressum  







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

Array-Delete Funktion

Ein Thema von olee · begonnen am 11. Nov 2008 · letzter Beitrag vom 12. Nov 2008
Antwort Antwort
Seite 2 von 3     12 3      
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#11

Re: Array-Delete Funktion

  Alt 11. Nov 2008, 14:58
Klassen sind ja mit Record sehr verwandt. Man könnte auch eine TObjectList verwenden
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von olee
olee

Registriert seit: 16. Feb 2008
Ort: Boppard
540 Beiträge
 
Turbo Delphi für Win32
 
#12

Re: Array-Delete Funktion

  Alt 11. Nov 2008, 15:02
Also um das mal klarzustellen:

Ich möchte keinesfalls eine Klasse verwenden!!

1.) Ich habe dieses Array sehr oft (Waypoints in ner Map also ca. 200 mal)
2.) Ich möchte nicht immer die TList / TObjectList neu erstellen.

--> mir gehts nur um die Performance eines Codes, um ein Element aus nem Array zu löschen.


MFG
Björn Zeutzheim
Codename: Performancepumpe
  Mit Zitat antworten Zitat
Benutzerbild von olee
olee

Registriert seit: 16. Feb 2008
Ort: Boppard
540 Beiträge
 
Turbo Delphi für Win32
 
#13

Re: Array-Delete Funktion

  Alt 11. Nov 2008, 15:06
Mein bisheriger Code:

Delphi-Quellcode:
  // zum löschen von mehreren Elementen gleichzeitig
  j := 0;
  for i := 0 to high(AnArray) do
  begin
    AnArray[i-j] := AnArray[i];
    If AnArray[i].destroyed then inc(j);
  end;
  SetLength(AnArray,Length(AnArray)-j);

  // zum löschen eines Elementes
  for i := Index to high(AnArray)-1 do
  begin
    AnArray[i] := AnArray[i+1];
  end;
  SetLength(AnArray,Length(AnArray)-1);
Also ich hab da schon Code nur ist es möglich, eine Funktion zu schreiben,
die ein beliebiges Array annimmt?

(Vllt. mit dem Move-Befehl???)
Björn Zeutzheim
Codename: Performancepumpe
  Mit Zitat antworten Zitat
Benutzerbild von jfheins
jfheins

Registriert seit: 10. Jun 2004
Ort: Garching (TUM)
4.579 Beiträge
 
#14

Re: Array-Delete Funktion

  Alt 11. Nov 2008, 15:09
vll. mit sowas wieprocedure DeleteIndex(var arr: Array of const; index: Integer) Aber ich glaube nicht, dass du das Array in der Prozedur verändern darfst ...

@Edit: Mit dem Movebefehl kannst du schnell viele arrayelemente verschieben, aber ich glaube, du darfst trotzdem nicht setlength aufrufen, um die länge anzupassen
  Mit Zitat antworten Zitat
Benutzerbild von olee
olee

Registriert seit: 16. Feb 2008
Ort: Boppard
540 Beiträge
 
Turbo Delphi für Win32
 
#15

Re: Array-Delete Funktion

  Alt 11. Nov 2008, 15:20
Also das würde heißen ich bräuchte eine Funktion wie die hier?

procedure DeleteIndex(arr: Pointer; index: Integer; ItemSize: Cardinal); und das Verschieben dann mit Move.

Aber wie müsste man dann wohl setLength manuell machen?
Björn Zeutzheim
Codename: Performancepumpe
  Mit Zitat antworten Zitat
Fridolin Walther

Registriert seit: 11. Mai 2008
Ort: Kühlungsborn
446 Beiträge
 
Delphi 2009 Professional
 
#16

Re: Array-Delete Funktion

  Alt 11. Nov 2008, 15:57
Hm ... wenn das Array nicht sortiert ist (bzw. nicht sortiert sein muss) wäre die performanteste Lösung wahrscheinlich folgende:

Wenn der zu löschende Eintrag der letzte Eintrag ist, einfach den letzten Eintrag abschneiden. Wenn der zu löschende Eintrag nicht der letzte Eintrag ist, einfach den letzten Eintrag mit dem zu löschenden tauschen und den letzten Eintrag abschneiden.
Fridolin Walther
  Mit Zitat antworten Zitat
Benutzerbild von olee
olee

Registriert seit: 16. Feb 2008
Ort: Boppard
540 Beiträge
 
Turbo Delphi für Win32
 
#17

Re: Array-Delete Funktion

  Alt 11. Nov 2008, 18:22
Oh man wie geil!

So simpel aber niemand kommt drauf ... außer dir

Das ist ja ne perfekte Lösung.

Aber du hast recht. Das ist nur möglich, da ich nie den Index der Elemente
zum Identifizieren benutze.
Björn Zeutzheim
Codename: Performancepumpe
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.169 Beiträge
 
Delphi 12 Athens
 
#18

Re: Array-Delete Funktion

  Alt 11. Nov 2008, 18:49
ich kann mir irgendwie nicht Helfen, aber ich bin mir sicher hier schon mehrmals Funktionen/Codes zum Einfügen/Löschen von von Einträgen gepostet zu haben ... nur finden ...

Hier im Forum suchenMove Hier im Forum suchenMoveMemory Hier im Forum suchenCopyMemory bringt nicht wirklich was
und nach [dp]*swap*[/dp] kann man ja leider nicht suchen
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Oreaden

Registriert seit: 10. Nov 2008
60 Beiträge
 
#19

Re: Array-Delete Funktion

  Alt 11. Nov 2008, 22:07
Zitat von olee:
Gibts ne Funktion, mit der man aus einem Array eines beliebigen Typs
Elemente löschen kann?

Also die das Array automatisch verkleinert und die Elemente entsprechend neu ordnet?
Es gibt ein Objekt das dies leistet. TList und ihre Ableitungen. Diese sind alle Arrays welche zusätzlich die Verwaltungsfunktionen wie verkleinern, neu Ordnen, etc. implementiert haben.

Noch einen schönen Abend
Oreaden
  Mit Zitat antworten Zitat
Medium

Registriert seit: 23. Jan 2008
3.679 Beiträge
 
Delphi 2007 Enterprise
 
#20

Re: Array-Delete Funktion

  Alt 12. Nov 2008, 04:51
Wenn du die maximale Größe des Arrays kennst, ist das Tauschen und seperate Mitführen des max-Indexes vermutlich wirklich die performanteste Lösung. Dann hast du eigentlich nur noch zwei Stolperfallen: Wenn es zu viele zu große Arrays sind, schlabberst du dir massig RAM weg das schlimmsten Falls zu einem winzigen Bruchteil tatsächlich verwendet wird, und versehentliche Aufrufe von SetLength könnten der Geschwindigkeit so richtig einen Dämpfer verpassen. Aber das "schlimmste" ist eigentlich, dass man sich die Performance durch potentiell gewaltigem Speicherverbrauch im Vergleich zur Nutzdatenmenge erkauft. Wenn die Arrays ohnehin meistens fast voll sind, ist das weniger tragisch. Schön oder elegant ist das halt aber nie. Nur performant
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 3     12 3      


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:32 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