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 1 von 3  1 23      
Benutzerbild von olee
olee

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

Array-Delete Funktion

  Alt 11. Nov 2008, 07:42
Hi liebe DP'ler

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?

Wenn nein, ist sowas möglich?

If not lastQuestion.Possible then, wie gestaltet man am besten eine Funktion, um
aus einem bestimmten array ein Element zu löschen?



MFG
Björn Zeutzheim
Codename: Performancepumpe
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

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

Re: Array-Delete Funktion

  Alt 11. Nov 2008, 07:45
Da würde ich eher eine Liste verwenden, da ist dies möglich. es wäre zwar möglich, dies auch für einen Array zu implemnetieren; der Aufwand ist es aber imho nicht wert.
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von Nersgatt
Nersgatt

Registriert seit: 12. Sep 2008
Ort: Emlichheim
693 Beiträge
 
Delphi 10.1 Berlin Professional
 
#3

Re: Array-Delete Funktion

  Alt 11. Nov 2008, 07:48
Moin,

wenn Du das Element n löschen willst, musst Du alle Elemente ab n+1 um eine Position runterschieben und am Schluss kannst Du mit SetLength die Größe des Arrays um 1 verringern. Je nach Größe des Array wird das aber recht langsam werden.
Besser ist es vielleicht, das Element n nicht wirklich zu löschen, sondern nur als "gelöscht" zu markieren. Deine Anwendung müsste dann gelöschte Elemente igonrieren.

Gruß,
Jens
Jens
  Mit Zitat antworten Zitat
Medium

Registriert seit: 23. Jan 2008
3.686 Beiträge
 
Delphi 2007 Enterprise
 
#4

Re: Array-Delete Funktion

  Alt 11. Nov 2008, 10:05
Zitat von mkinzler:
Da würde ich eher eine Liste verwenden
Das, und nichts anderes.
"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
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.625 Beiträge
 
Delphi 12 Athens
 
#5

Re: Array-Delete Funktion

  Alt 11. Nov 2008, 10:23
Aber dann TList. Eine verkettete Liste wäre zwar auch noch eine Option, ist aber um einiges aufwändiger.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#6

Re: Array-Delete Funktion

  Alt 11. Nov 2008, 10:41
Hi,

Naja an die Leute, die hier groß "TList" rufen:

Delphi-Quellcode:
// TList spezifische Dinge weggelassen
procedure TList.Delete(Index: Integer);
var
  Temp: Pointer;
begin
  if (Index < 0) or (Index >= FCount) then
    exit;

  Dec(FCount);
  if Index < FCount then
    System.Move(FList^[Index + 1], FList^[Index],(FCount - Index) * SizeOf(Pointer));
end;
TList ist ja im Prinzip auch nurn Array

TList gibt allerdings reservierten Speicher nicht frei. Also kein SetLength.

PS: Aber handlicher ist TList mit Sicherheit trotzdem
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
DerDan

Registriert seit: 15. Nov 2004
Ort: Donaueschingen
251 Beiträge
 
Delphi XE3 Professional
 
#7

Re: Array-Delete Funktion

  Alt 11. Nov 2008, 10:48
Hallo,



Zitat von Nersgatt:
Moin,

wenn Du das Element n löschen willst, musst Du alle Elemente ab n+1 um eine Position runterschieben und am Schluss kannst Du mit SetLength die Größe des Arrays um 1 verringern. Je nach Größe des Array wird das aber recht langsam werden.
Besser ist es vielleicht, das Element n nicht wirklich zu löschen, sondern nur als "gelöscht" zu markieren. Deine Anwendung müsste dann gelöschte Elemente igonrieren.

Gruß,
Jens

Das hab ich so auch mal so realisiert, die Elemente erstmal nur zu markieren, hat gut funktioniert.
Man kann ja von Zeit zu Zeit das Array wieder bereinigen.


Kommt halt immer drauf an, wie man auf die Daten zugreifen will.
Wenn man nicht unbedingt über einen Index zugreifen will, kann man auch über doppelt verkettet Listen nachdenken. Dort sind Einfüge und Löschen Operationen schnell möglich. allerdings kann man auf die Daten nur sequenziell zugreifen.

Mit den Listen vom Typ "TList" in der Unit Classes hat das nichts zu tun. Die funktionieren intern wieder mit den dynamischen Arrays. Da bei Änderungen immer noch eine virtuelle Notify Funktion aufgerufen wird, ist die Performance mit selbst verwalteten dynamischen Arrays besser.


mfg

DerDan
nichts ist so schön wie man es sich vorstellt
  Mit Zitat antworten Zitat
Benutzerbild von olee
olee

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

Re: Array-Delete Funktion

  Alt 11. Nov 2008, 15:50
Also mir war schon klar, dass man den Inhalt des Arrays neu kopieren muss.

Mir gings mehr um das WIE (Performance).

BTW: Ich hab ein Array mit Pointern also wirklich fast ne TList.

Der nachteil von TList ist eben nur, dass man ne klasse hat,
was ich nur sehr ungern haben will.

Ich hätte meine Frage genauer formuliert, musste aber in die Schule

EDIT:
System.Move(FList^[Index + 1], FList^[Index],(FCount - Index) * SizeOf(Pointer));
Was das macht ist mir noch nicht so klar


MFG
Björn Zeutzheim
Codename: Performancepumpe
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

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

Re: Array-Delete Funktion

  Alt 11. Nov 2008, 15:52
Zitat:
Der nachteil von TList ist eben nur, dass man ne klasse hat,
was ich nur sehr ungern haben will.
OOP würde ich eher als Vorteil ansehen
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
 
#10

Re: Array-Delete Funktion

  Alt 11. Nov 2008, 15:55
da stimme ich dir zum Teil zu.

Doch das ist nicht immer der Fall.

Ein Beispiel: RECORDS!

Ohne TList könnte ich einfach neue Varieblen davon anlegen, ohne was machen zu müssen.
Mit ner klasse müsste ich nen "constructor" (im gewissen Sinne) basteln.

Hat denn jmd. nen Code-Vorschlag für mein Problem?

EDIT: !!! Korrektur: In meinem Array sind keine Pointer, aber sehr kleine Records,
die selten mehr als 5 werden.
Björn Zeutzheim
Codename: Performancepumpe
  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 11: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