AGB  ·  Datenschutz  ·  Impressum  







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

Ein Element eines Arrays löschen?

Ein Thema von .chicken · begonnen am 31. Mär 2007 · letzter Beitrag vom 1. Apr 2007
Antwort Antwort
.chicken

Registriert seit: 5. Dez 2006
459 Beiträge
 
#1

Ein Element eines Arrays löschen?

  Alt 31. Mär 2007, 23:20
Ist es möglich, dass ich aus einem dynamischen Array einen Teil lösche, so dass der andere Teil nachrückt?

Also zB so:
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!
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#2

Re: Ein Element eines Arrays löschen?

  Alt 31. Mär 2007, 23:23
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
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
.chicken

Registriert seit: 5. Dez 2006
459 Beiträge
 
#3

Re: Ein Element eines Arrays löschen?

  Alt 31. Mär 2007, 23:36
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?
  Mit Zitat antworten Zitat
Der_Unwissende

Registriert seit: 13. Dez 2003
Ort: Berlin
1.756 Beiträge
 
#4

Re: Ein Element eines Arrays löschen?

  Alt 31. Mär 2007, 23:47
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]
  Mit Zitat antworten Zitat
.chicken

Registriert seit: 5. Dez 2006
459 Beiträge
 
#5

Re: Ein Element eines Arrays löschen?

  Alt 31. Mär 2007, 23:51
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
  Mit Zitat antworten Zitat
Hawkeye219

Registriert seit: 18. Feb 2006
Ort: Stolberg
2.227 Beiträge
 
Delphi 2010 Professional
 
#6

Re: Ein Element eines Arrays löschen?

  Alt 1. Apr 2007, 00:10
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:

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
  Mit Zitat antworten Zitat
Benutzerbild von inherited
inherited

Registriert seit: 19. Dez 2005
Ort: Rosdorf
2.022 Beiträge
 
Turbo Delphi für Win32
 
#7

Re: Ein Element eines Arrays löschen?

  Alt 1. Apr 2007, 00:18
Du könntest auch eine TList verwenden (Allerdings nicht unbedingt bei Integer-Werten)
Nikolai Wyderka

SWIM SWIM HUNGRY!
Neuer Blog: hier!
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#8

Re: Ein Element eines Arrays löschen?

  Alt 1. Apr 2007, 09:30
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
  Mit Zitat antworten Zitat
Benutzerbild von inherited
inherited

Registriert seit: 19. Dez 2005
Ort: Rosdorf
2.022 Beiträge
 
Turbo Delphi für Win32
 
#9

Re: Ein Element eines Arrays löschen?

  Alt 1. Apr 2007, 11:06
So hab ich da noch garnicht drüber nachgedacht, ist aber eine gute Idee.
Nikolai Wyderka

SWIM SWIM HUNGRY!
Neuer Blog: hier!
  Mit Zitat antworten Zitat
Benutzerbild von jim_raynor
jim_raynor

Registriert seit: 17. Okt 2004
Ort: Berlin
1.251 Beiträge
 
Delphi 5 Standard
 
#10

Re: Ein Element eines Arrays löschen?

  Alt 1. Apr 2007, 14:05
Oder man schaut in die Code-Library

http://www.delphipraxis.net/internal...ht=deletearray
Christian Reich
Schaut euch mein X-COM Remake X-Force: Fight For Destiny ( http://www.xforce-online.de ) an.
  Mit Zitat antworten Zitat
Antwort Antwort


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 05:53 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