AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Fehler bei setlength von dynamischen Array
Thema durchsuchen
Ansicht
Themen-Optionen

Fehler bei setlength von dynamischen Array

Ein Thema von schuetzejanett · begonnen am 4. Jan 2007 · letzter Beitrag vom 5. Jan 2007
Antwort Antwort
schuetzejanett

Registriert seit: 5. Apr 2006
Ort: Fraureuth
62 Beiträge
 
#1

Fehler bei setlength von dynamischen Array

  Alt 4. Jan 2007, 18:36
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;
  Mit Zitat antworten Zitat
marabu

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

Re: Fehler bei setlength von dynamischen Array

  Alt 4. Jan 2007, 18:44
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
  Mit Zitat antworten Zitat
schuetzejanett

Registriert seit: 5. Apr 2006
Ort: Fraureuth
62 Beiträge
 
#3

Re: Fehler bei setlength von dynamischen Array

  Alt 4. Jan 2007, 18:53
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.
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.861 Beiträge
 
Delphi 11 Alexandria
 
#4

Re: Fehler bei setlength von dynamischen Array

  Alt 4. Jan 2007, 19:02
Erzeuge eine Methode für das Hinzufügen neuer Einträge.
Markus Kinzler
  Mit Zitat antworten Zitat
marabu

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

Re: Fehler bei setlength von dynamischen Array

  Alt 5. Jan 2007, 09:51
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
  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 14:05 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