Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Ein Element eines Arrays löschen? (https://www.delphipraxis.net/89484-ein-element-eines-arrays-loeschen.html)

.chicken 31. Mär 2007 22:20


Ein Element eines Arrays löschen?
 
Ist es möglich, dass ich aus einem dynamischen Array einen Teil lösche, so dass der andere Teil nachrückt?

Also zB so:
Delphi-Quellcode:
myArray: Array [1..10 of Integer];
Kann ich nun daraus Element 5 löschen, sodass Element 6 dann zu 5 wird und 7 zu 6 etc...?

Hoffe ihr wisst was ich meine!

SirThornberry 31. Mär 2007 22:23

Re: Ein Element eines Arrays löschen?
 
direkt löschen wüsst ich nicht das es da eine funktion gibt.
Du könntest es zum einen mit einer schleife machen oder mit move

.chicken 31. Mär 2007 22:36

Re: Ein Element eines Arrays löschen?
 
Was passiert denn bei Move, mit dem was vorher an der Position war?
Also wenn ich zB Element 6 an die 5. Stelle setze, was wird dann aus Element 5?

Der_Unwissende 31. Mär 2007 22:47

Re: Ein Element eines Arrays löschen?
 
Zitat:

Zitat von .chicken
Was passiert denn bei Move, mit dem was vorher an der Position war?
Also wenn ich zB Element 6 an die 5. Stelle setze, was wird dann aus Element 5?

Move verschiebt einfach (ohne große Kontrolle) einen Speicherbereich. Du gibst einfach eine Zielposition, eine Startposition und eine Länge an. Die Position beziehen sich dabei direkt auf den Speicher und die Länge wird in Bytes angegeben. Move kopiert dann einfach die Daten und überschreibt alles an der Zielposition. Ob diese gültig ist oder nicht wird move auch nicht prüfen, darum solltest Du Dich tunlichst selbst kümmern (sonst gibt es unerwartete Exceptions, wobei man die hoffentlich nie erwartet).

Delphi-Quellcode:
var a: Array of Integer;
begin
 setLength(a, 6);
 // ...
 // Sei a = [1, 2, 3, 4, 5, 6]

 // Verschieben der Positionen a[4] und a[5] an den Anfang des Arrays
 // FALSCH move(a[0], a[4], 2*sizeOf(a[4]));
 // Korrigierte Version (danke @Hawkeye219)
 move(a[4], a[0], 2*sizeOf(a[4]));
 // neue Belegung von a = [5, 6, 3, 4, 5, 6]
 // verkleinern des Arrays
 setLength(a, 2);
 // neue Belegung von a = [5, 6]
end;
Gruß Der Unwissende

[edit]
Fehler Korrigiert, nochmal danke @Hawkeye219
[/edit]

.chicken 31. Mär 2007 22:51

Re: Ein Element eines Arrays löschen?
 
Boah du hilfst mir ja echt in jedem meiner Probleme ^^
Dankeschön, hab mir schon gedacht das ich sowas dann selbst schreiben muss, aber wollte lieber erst nachfragen obs ne elegantere Lösung gibt ;-)

Danke

Hawkeye219 31. Mär 2007 23:10

Re: Ein Element eines Arrays löschen?
 
Hallo,

eine kleine aber wichtige Korrektur: der erste Parameter gibt die Quelle, der zweite das Ziel an. Im obigen Beispiel muß die Move-Zeile demnach so aussehen:

Delphi-Quellcode:
move(a[4], a[0], 2*sizeOf(a[4]));
Wie Der_Unwissende schon angedeutet hat, sollte man Move nicht auf Arrays anwenden, deren Elemente Objektreferenzen oder dynamische Daten (Strings, Arrays) sind. Man unterwandert damit die Speicherverwaltung von Delphi und riskiert Speicherlöcher bzw. Schutzverletzungen.

Gruß Hawkeye

inherited 31. Mär 2007 23:18

Re: Ein Element eines Arrays löschen?
 
Du könntest auch eine TList verwenden (Allerdings nicht unbedingt bei Integer-Werten)

marabu 1. Apr 2007 08:30

Re: Ein Element eines Arrays löschen?
 
Hallo Nikolai,

warum nicht? Der von TList verwaltete Zeiger hat den gleichen Platzbedarf wie DWORD, Cardinal und Integer.

Wenn das Array ungeordnet ist, dann geht auch sowas:

Delphi-Quellcode:
uses
  Types;

procedure DeleteItem(var ida: TIntegerDynArray; index: Integer);
begin
  if index in [Low(ida) .. High(ida)] then
  begin
    if index < Length(ida) then
      ida[index] := ida[High(ida)];
    SetLength(ida, High(ida));
  end;
end;
Getippt und nicht getestet.

Schönes Wochenende

inherited 1. Apr 2007 10:06

Re: Ein Element eines Arrays löschen?
 
So hab ich da noch garnicht drüber nachgedacht, ist aber eine gute Idee. :gruebel:

jim_raynor 1. Apr 2007 13:05

Re: Ein Element eines Arrays löschen?
 
Oder man schaut in die Code-Library ;)

http://www.delphipraxis.net/internal...ht=deletearray


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:35 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