Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Was ist falsch an meiner Liste (https://www.delphipraxis.net/84070-ist-falsch-meiner-liste.html)

schuetzejanett 10. Jan 2007 22:51


Was ist falsch an meiner Liste
 
Hallo,

habe das Problem mit den dynamischen Arrays und der Größenänderung noch mal überdacht und wollte es deswegen mit einer einfach verketteten Liste probieren.
Könnt ihr mal gucken ob das so stimmt.
Beim eintragen merke ich zwar keine Fehler weiß allerdings nicht ob das alles so richtig ist oder ob er die Werte wieder überschreibt und bei der ausgabe(erstellt zur Zeit nur nen String der die Werte enthält zu Testzwecken) also show Methode knallts beim Aufruf.

Was mache ich falsch und sollte ich ändern? Ist der Destruktor so richtig ?

Delphi-Quellcode:
// die Definition der Liste

Type TShot = Array[0..2] of String;
 
      TLPoints = ^TPoints;

      TPoints = Record
          shot : TShot;
          next : TLPoints
      end;


//die eigenschaaften/ felder der klasse
type TPlayer = class(TObject)
  private
   f_name :String;
   f_stand: integer;
   f_finished: boolean;
   f_place: integer;
   f_points : tLPoints;
   f_fields : tAFields;
   root : tLPoints;

//die Methoden zum hinzufügen und ausgeben
 procedure pointsAdd(point : Tshot);
 procedure pointsShow(var s :String);

procedure TPlayer.pointsAdd(point: Tshot);
var
   knot : TLPoints;
begin
  if f_points = nil then
    begin
      New(root);
      f_points := root;
      f_points^.shot := point;
      f_points^.next := nil;
    end
  else
    begin
      new(knot);
      f_points^.shot := point;
      f_points^.next := knot;
      f_points := knot;
      f_points^.next := nil;
    end;

end;

procedure TPlayer.pointsShow(var s :String);
var
    i,j : integer;
begin
f_points := root;
i := 1;
s := inttostr(i) + '. ter Wurf: ';
while f_points.next^.next <> nil do
  begin
    for j := 0 to 3 do
    s:= s+  f_points^.shot[j] + ' ';
    f_points := f_points^.next;
  end;
  s := s+#13#10;
end;
 
//der Destruktor
destructor TPlayer.Destroy;
begin
setlength(f_fields, 0);
f_points := root;
while f_points^.next <> NIL do
  begin
    Root := f_points;
    f_points := Root^.Next;
    Dispose(Root);
  end;
 Dispose(F_points);
inherited Destroy;
end;

Klaus01 11. Jan 2007 06:41

Re: Was ist falsch an meiner Liste
 
Zitat:

Delphi-Quellcode:
 while f_points.next^.next <> nil do // und hier fragst Du am Ender der liste nach nil.next^.next da knallt es dann.
  begin
    for j := 0 to 3 do
    s:= s+  f_points^.shot[j] + ' ';
    f_points := f_points^.next;  // beim leztzten Element weißt Du hier f_points nil zu
  end;
  s := s+#13#10;
end;

Delphi-Quellcode:
while f_points <> nil do
  begin
    for j := 0 to 3 do
    s:= s+  f_points^.shot[j] + ' ';
    f_points := f_points^.next;
  end;
  s := s+#13#10;
end;
beim destry ist es ähnlich.
Zitat:

Delphi-Quellcode:
f_points := root;
while f_points^.next <> NIL do // hier bleibt immer ein Element übrig, denn wenn f_points^.next = nil
                               // ist gibt es noch ein f_points Element
                               // besse while f_points <> nil, denn wenn F-points nil ist, ist die Liste leer
  begin
    Root := f_points;
    f_points := Root^.Next;
    Dispose(Root);
  end;
Dispose(F_points);

Grüße
Klaus

schuetzejanett 12. Jan 2007 07:12

Re: Was ist falsch an meiner Liste
 
hallo

danke für deine Hilfe, er bringt jetzt keinen Fehler mehr, allerdings gibt er bei pointsshow immer nur das zuletzt eingetragene Element aus . Woran könnte das liegen?

MrSpock 12. Jan 2007 07:31

Re: Was ist falsch an meiner Liste
 
Hallo schuetzejanett,

wenn du einen neuen Punkt einfügst, setzt du root ja immer auf diesen neuen Punkt.

schuetzejanett 12. Jan 2007 08:14

Re: Was ist falsch an meiner Liste
 
Hallo ,

habe zwar verstanden was Mr Spock mir sagen wollte weiß allerdings immer noch nicht so recht was ich ändern muss damit ich meine ganzen punkte sehe

Klaus01 12. Jan 2007 08:16

Re: Was ist falsch an meiner Liste
 
Zitat:

Zitat von MrSpock
Hallo schuetzejanett,

wenn du einen neuen Punkt einfügst, setzt du root ja immer auf diesen neuen Punkt.

Da schaut aber nicht so aus:
Delphi-Quellcode:
procedure TPlayer.pointsAdd(point: Tshot);
var
   knot : TLPoints;
begin
  if f_points = nil then
    begin
      New(root);
      f_points := root;
      f_points^.shot := point;
      f_points^.next := nil;
    end
  else
    begin
      new(knot);
      f_points^.shot := point;  // hier liegt der Fehler
      f_points^.next := knot;
      f_points := knot;
      f_points^.next := nil;
    end;
end;
root wird nur dann gesetzt wenn f_points = nil ist, d.h. wenn die Liste leer ist.
Oder habe ich da etwas übersehen?

@Janett

Setzt Du zu Beginn f_points auf nil?
Denn eine leere Liste hat nicht zwangsläufig den Wert/die Adresse nil.

Delphi-Quellcode:
procedure TPlayer.pointsAdd(point: Tshot);
var
   knot : TLPoints;
begin
  if f_points = nil then
    begin
      New(root);
      f_points := root;
      f_points^.shot := point;
      f_points^.next := nil;
    end
  else
    begin
      new(knot);
      //f_points^.shot := point;  // hier liegt der Fehler
      f_points^.next := knot;
      f_points := knot;
      f_points^.next := nil;
      f_points^.shot := point;
    end;
end;
Grüße
Klaus


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