AGB  ·  Datenschutz  ·  Impressum  







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

Was macht Free genau in einem Array

Ein Thema von s.h.a.r.k · begonnen am 8. Dez 2005 · letzter Beitrag vom 12. Dez 2005
 
Der_Unwissende

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

Re: Was macht Free genau in einem Array

  Alt 9. Dez 2005, 19:33
Hi,
so musstest zwar etwas warten, aber ich habs mir jetzt noch mal anschauen können und den Fehler nun auch gefunden.
Ist eigentlich nichts weiter wildes (man kann es leicht übersehen).

Delphi-Quellcode:
  if (Index > -1) and (Index < FCount) then begin
    for i := Index to FCount - 2 do FItems[i] := FItems[i + 1];
    FItems[FCount - 1].Free;
    setlength(FItems, FCount - 1);
    FCount := length(FItems);

    if (Index = FCount) then dec(Index);
      FItemIndex := Index;
      if (Index > -1) then FActiveIndex := FItems[Index] else FActiveIndex := nil;
  end;
Guck dir mal kurz Schritt für Schritt an was du machst. Du hast ein Element an der Stelle Index, das du gerne Löschen würdest. Nun kontrollierst du ob Index gültig ist und ok, wenn es der Fall ist, werden alle Elemente die dahinter (aufpassen, nur die Referenz) nach vorne kopiert.
Danach gibst du das Element an der Stelle FCount - 1 frei. Hier liegt dein Fehler. Du kannst natürlich nicht mehr das Element an der Stelle Index freigeben, da liegt schließlich eine andere Referenz, aber das letzte Element ist auch nicht das, das du freigeben willst.
Nun ja, sagen wir deine Liste ist 5 lang und sagen wir, du hättest ein FItems wie Folgt : [1,2,3,4,5] und du löscht 2, dann bekommst du was? [1,3,4,5,5] (alles um eine Stelle nach links kopiert), dann gibst du das letzte Element frei [1,3,4,nil,nil] (weil gleiche Referenz). Wenn du nun ein Free auf nil anwenden willst knallt's.

Deshalb brauchst du einen Puffer, indem du dir das Element an der Stelle Index merkst

Delphi-Quellcode:
procedure TLaufzettel.Delete(Index: Integer);
var i : Integer;
    buffer : TDigitalerLaufzettel;
begin
  if (Index > -1) and (Index < FCount) then begin
    buffer := FItems[Index];
    for i := Index to FCount - 2 do
      FItems[i] := FItems[i + 1];
    buffer.Free;
    setlength(FItems, FCount - 1);
    FCount := length(FItems);

    if (Index = FCount) then dec(Index);
      FItemIndex := Index;
      if (Index > -1) then FActiveIndex := FItems[Index] else FActiveIndex := nil;
  end;
end;
Dann sollte alles klappen. (hoff ich jetzt mal, ungetesteter Weise)

Gruß
  Mit Zitat antworten Zitat
 


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 18:39 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz