Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Problem mit verketteter Liste (https://www.delphipraxis.net/84282-problem-mit-verketteter-liste.html)

Koller 14. Jan 2007 19:06


Problem mit verketteter Liste
 
Ich schreibe soeben die Hinzufügen-Routine einer verketteten Liste (TParameterList):
Delphi-Quellcode:
type
  PItem = ^TItem;
  TItem = record
    Data: TParameter;
    Next: PItem;
  end;

procedure TParameterlist.AddAtEnd(AParameter: TParameter);
var NewItem: PItem;
begin
  New(NewItem);
  //das hier tritt immer wieder ein, auch beim zweiten und dritten mal O_o
  if (FFirst = nil) then
  begin
    showmessage('1');
    NewItem.Data := AParameter;
    NewItem.Next := nil;
   
    //warum ist FFirst hier nach immer noch nil?
    FFirst := NewItem;
    FLast := NewItem;

    Dispose(NewItem);
  end
  //dieser Block wird NIE durchlaufen
  else begin
    showmessage('2');
    NewItem.Data := AParameter;
    NewItem.Next := nil;

    FLast.Next := NewItem;
    FLast := NewItem;

    Dispose(NewItem);
  end;

  inc(FCount);
end;

//vlt. liegt's am constructor irgendwie???
constructor TParameterlist.Create;
begin
  FFirst := nil;
  FLast := nil;
  FCurrently := nil;

  FCount := 0;
end;
Das Problem ist mit Kommentaren versehen. ;)

Der_Unwissende 14. Jan 2007 19:14

Re: Problem mit verketteter Liste
 
Hi,
da wo Du den Kommentar gesetzt hast, ist die Variable nicht mehr nil.
Aber schau dir mal die folgenden Zeilen an und kommentiere was jede dieser Zeilen macht.

Gruß Der Unwissende

mkinzler 14. Jan 2007 19:15

Re: Problem mit verketteter Liste
 
Wo ist FFirst deklariert?

Hawkeye219 14. Jan 2007 20:33

Re: Problem mit verketteter Liste
 
Hallo Koller,

du solltest die mit New() erzeugten Elemente nicht direkt nach dem Einfügen in die Liste freigeben, sonst erhältst du Zeiger, die ins Nirwana zeigen. Den Speicherbereich darfst du erst nach dem Entfernen eines Elements aus der Liste wieder freigeben.

Nimm mal die zwei Dispose-Aufrufe aus deinem Code raus und teste erneut.

Gruß Hawkeye


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