Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Fehler bei setlength von dynamischen Array (https://www.delphipraxis.net/83569-fehler-bei-setlength-von-dynamischen-array.html)

schuetzejanett 4. Jan 2007 17:36


Fehler bei setlength von dynamischen Array
 
Hallo ich habe eine Klasse spieler in der der u.a der typ tshot = array[0..2] of String und der Typ TApoints = Array of Tshot definiert sind.
Nun möchte ich von einer anderen Unit aus auf diesen TAPoints Typ zugreifen und dort dynamisch die Länge setzen. Das geht beim ersten Mal auch aber sobald ich den befehl noch mal aufrufe würft er eine EinvalidPointer Exception ungültige zeigeroperation.
Woran liegt das was mache ich falsch?

Delphi-Quellcode:

type TShot = Array[0..2] of String;
type tAPoints = Array of TShot;

procedure TForm_Game.bokClick(Sender: TObject);
var goals : Tshot;
 points : TAPoints;
 
begin
  points := aplayer[aktplayer].points;
  goals[0]:= lewurf1.Text;
  goals[1]:= lewurf2.Text;
  goals[2]:= lewurf3.Text;

  case start.art of
    2:begin
       X01.throw(aplayer[aktplayer], goals );
       alabel[aktplayer].Text := inttostr(aplayer[aktplayer].stand);    
       setlength(points, length(points)+1);
       points[high(points)] := goals;
       aplayer[aktplayer].points := points;
       astringgrid[aktplayer *2].Cells[1,length(points)] := goals[0];
       astringgrid[aktplayer *2].Cells[2,length(points)] := goals[1];
       astringgrid[aktplayer *2].Cells[3,length(points)] := goals[2];
       changePlayer;
      end;
  end;
end;

marabu 4. Jan 2007 17:44

Re: Fehler bei setlength von dynamischen Array
 
Hallo,

du kannst nicht SetLength() auf einen Typ anwenden. Und die Variable points ist eine lokale Variable der Methode - die kannst du von einer anderen Unit aus nie erreichen.

Grüße vom marabu

schuetzejanett 4. Jan 2007 17:53

Re: Fehler bei setlength von dynamischen Array
 
Die Eigenschaft points ist eine Eigenschaft der Klasse spieler. welche so definiert ist

Delphi-Quellcode:
 
property points: tAPoints read f_Points write f_points;

Hier in dieser Methode hole ich mir nur das aktuelle points feld und hänge einen eintrag an und schreibe es wieder zurück. Was wie gesagt beim ersten mal auch super funktioniert. Beim zweiten mal kann ich mir die eigenschaft points auch noch holen und meiner variable points zuweisen allerdings kann ich das feld dann nicht mehr erhöhen.
Was muss ich ändern um das points feld dynamisch zu vergrößern da ich ja zu beginn des spiel nicht weiß wieviel einträge hineinkommen.

mkinzler 4. Jan 2007 18:02

Re: Fehler bei setlength von dynamischen Array
 
Erzeuge eine Methode für das Hinzufügen neuer Einträge.

marabu 5. Jan 2007 08:51

Re: Fehler bei setlength von dynamischen Array
 
Hallo,

in erster Linie solltest du etwas vorsichtiger mit dynamischen Arrays umgehen. Solche Arrays sind eigentlich Zeiger und dein Aufruf von Setlength() verändert diesen Zeiger. Nehmen wir an, deine beim aktuellen Player gespeicherten Points hätten den Zeigerwert $900000. Durch deine Zuweisung an die lokale Variable points zeigt diese auf den gleichen Speicherbereich. Durch deinen Aufruf von Setlength() wird ein vergrößerter Speicherbereich angelegt. Wenn möglich, dann wird einfach der vorhandene Speicherblock vergrößert und das neue Item ist uninitialisiert. Ist nicht genügend Platz, dann wird ein neuer Speicherblock an einer anderen Stelle angefordert, der alte Inhalt dort hinein kopiert und deine Array-Variable aktualisiert, so dass sie anschließend auf $900042 zeigt. Deine Original-Points zeigen weiterhin auf den alten Speicherblock. Musste der alte Speicherblock aufgegeben werden, dann stehen deine Chancen auf eine Exception gut.

Freundliche Grüße


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