AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Delphi Ungewollter Zugriff auf in einem Array gespeichertes Objekt
Thema durchsuchen
Ansicht
Themen-Optionen

Ungewollter Zugriff auf in einem Array gespeichertes Objekt

Ein Thema von SquareEnix · begonnen am 8. Sep 2009 · letzter Beitrag vom 9. Sep 2009
Antwort Antwort
Seite 1 von 3  1 23      
SquareEnix

Registriert seit: 8. Sep 2009
15 Beiträge
 
Delphi 3 Professional
 
#1

Ungewollter Zugriff auf in einem Array gespeichertes Objekt

  Alt 8. Sep 2009, 21:10
Ich bin grade dabei ein kleines Spiel zu Programmieren. In diesem Spiel verwende ich die Klasse TRobot die ich von TDatabase ableitete. Um eine limitierte Zahl von Robotern im Spiel gleichzeitig verwenden zu können erstellte ich einen Array für die Roboter:
Delphi-Quellcode:
...
var
Roboter: Array[1..10] of TRobot;
...
In FormCreate wurden die Roboter, die ich bis dahin brauchte, dann erstellt:
Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
begin
...
Roboter[1]:=TRobot.Create(self);
Roboter[2]:=TRobot.Create(self);
Roboter[1].Initialisieren(10,10,0,2);
Roboter[2].Initialisieren(400,200,Pi,2);
...
end;
Die Syntax von TRobot.Initialisieren ist (PositionX, PositionY, Startwinkel, Geschwindigkeit) .

Nun zu meinem Problem:
obwohl ich zwei unterschiedliche Objekte anspreche (Roboter[1] & Roboter[2]) überschreibt Roboter[2].Initialisieren(400,200,Pi,2); die bereits festgelegten Variablen von Roboter[1].
Das hat zur Folge, das anstatt zwei Robotern auf dem Formular entweder nur eins oder zwei übereinandergelegte Roboter erscheinen (ich kann es nicht genau beurteilen).
Woran liegt das? Danke schon im Voraus!
  Mit Zitat antworten Zitat
Benutzerbild von sx2008
sx2008

Registriert seit: 16. Feb 2008
Ort: Baden-Württemberg
2.332 Beiträge
 
Delphi 2007 Professional
 
#2

Re: Ungewollter Zugriff auf in einem Array gespeichertes Obj

  Alt 8. Sep 2009, 23:42
Zitat von SquareEnix:
In diesem Spiel verwende ich die Klasse TRobot die ich von TDatabase ableitete
Das hört sich nicht gut an.
TRobot ist bestimmt keine Klasse, die man von TDatabase ableiten sollte.
Vielleicht braucht TRobot Zugriff auf eine Datenbank, aber Vererbung wäre hier falsch.
Zitat von SquareEnix:
obwohl ich zwei unterschiedliche Objekte anspreche (Roboter[1] & Roboter[2]) überschreibt
Roboter[2].Initialisieren(400,200,Pi,2); die bereits festgelegten Variablen von Roboter[1]
Dann wird das Problem in der Klasse TRobot zu suchen sein.
Greifst du irgendwie auf globale Variablen zu?
Gibt es z.B. eine weitere Variable robot:TRobot, auf die du zugreifst?
fork me on Github
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

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

Re: Ungewollter Zugriff auf in einem Array gespeichertes Obj

  Alt 9. Sep 2009, 07:33
Poste am Besten mal die Klasse. Den der Fehler sollte in der Methode Initialisieren zu finden sein
Markus Kinzler
  Mit Zitat antworten Zitat
SquareEnix

Registriert seit: 8. Sep 2009
15 Beiträge
 
Delphi 3 Professional
 
#4

Re: Ungewollter Zugriff auf in einem Array gespeichertes Obj

  Alt 9. Sep 2009, 09:31
@sx2008
Ich weiß auch nicht warum ich TRobot überhaupt abgeleitet habe, denn es verwendent keine der Attribute oder Methoden von TDatabase... Ich glaube ich werde es extrahieren und eigenständig machen.

Zu deiner Frage: Ich verwende in der Klasse TRobot eine Variable, die ein TRobot ist:
Delphi-Quellcode:
...
var
Ziel: TRobot;
...
procedure TRobot.ZielAussuchen (Feinde: Array of TRobot; Prioritaet: integer);
var i: integer; Entfernung: double;
begin
Entfernung:=1000000;
for i:= 1 to (High(Feinde))+1 do
  begin
    if EntfernungMessen(Feinde[i].PPunkt)<Entfernung then
      begin
      Entfernung:=EntfernungMessen(Feinde[i].PPunkt);
      Ziel:=Feinde[i];
      Showmessage('Ziel gewählt');
      end;
  end;
end;
...
Diese Methode dient dazu, dass der Roboter den ihm nächsten Feind angreift.

Zur restlichen Klasse inklusiv Initialisieren:
Delphi-Quellcode:
unit Robot;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  DBTables;

type
  TRobot = class(TDatabase)
  private
    { Private-Deklarationen }
  protected
    { Protected-Deklarationen }
  public
  ...
  procedure Initialisieren(PosX, PosY: integer; StartWinkel, Geschwindigkeit: double);
  ...
    { Public-Deklarationen }
  published
    { Published-Deklarationen }
  end;


procedure Register;
var Position:Array[1..2] of integer;
    Winkel_1,Speed:double;
    Ziel: TRobot;

implementation

...

procedure TRobot.Initialisieren (PosX, PosY: integer; StartWinkel, Geschwindigkeit: double);
begin
Position[1]:=PosX;
Position[2]:=PosY;
Winkel_1:=StartWinkel;
Speed:=Geschwindigkeit;
end;

...

end.
Ich hoffe das hilft weiter. Es kann sein, dass euch die Programmierung etwas schlampig vorkommt, aber ich programmiere erst seit kurzem öfters. Danke bereits für die Posts!
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

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

Re: Ungewollter Zugriff auf in einem Array gespeichertes Obj

  Alt 9. Sep 2009, 09:37
Du verwendest für alle Insatnzen die selben globalen Variablen! Ich würde hierfür Member der Klasse verwenden

Delphi-Quellcode:
unit Robot;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  DBTables;

type
  TRobot = class(TDatabase)
  private
    { Private-Deklarationen }
    Position:Array[1..2] of integer;
    Winkel_1,Speed:double;
    Ziel: TRobot;
  protected
    { Protected-Deklarationen }
  public
  ...
  procedure Initialisieren(PosX, PosY: integer; StartWinkel, Geschwindigkeit: double);
  ...
    { Public-Deklarationen }
  published
    { Published-Deklarationen }
  end;


procedure Register;
    
implementation

...

procedure TRobot.Initialisieren (PosX, PosY: integer; StartWinkel, Geschwindigkeit: double);
begin
  Position[1]:=PosX;
  Position[2]:=PosY;
  Winkel_1:=StartWinkel;
  Speed:=Geschwindigkeit;
end;

...

end.
Markus Kinzler
  Mit Zitat antworten Zitat
SquareEnix

Registriert seit: 8. Sep 2009
15 Beiträge
 
Delphi 3 Professional
 
#6

Re: Ungewollter Zugriff auf in einem Array gespeichertes Obj

  Alt 9. Sep 2009, 09:44
Ich habe es genau so gemacht, aber jetzt startet das Programm nicht. Es gibt eine Fehlermeldung sobald der Compiler zur Initialisierung der Roboter kommt. Ab dieser Zeile geht nichts meht
Position[1]:=PositionX;
  Mit Zitat antworten Zitat
schlecki

Registriert seit: 11. Apr 2005
Ort: Darmstadt
148 Beiträge
 
Delphi XE2 Enterprise
 
#7

Re: Ungewollter Zugriff auf in einem Array gespeichertes Obj

  Alt 9. Sep 2009, 09:44
Zitat von SquareEnix:
@sx2008
Ich weiß auch nicht warum ich TRobot überhaupt abgeleitet habe, denn es verwendent keine der Attribute oder Methoden von TDatabase... Ich glaube ich werde es extrahieren und eigenständig machen.

Delphi-Quellcode:
{...}
type
  TRobot = class(TDatabase)
{...}
  end;

procedure Register;
var Position:Array[1..2] of integer;
    Winkel_1,Speed:double;
    Ziel: TRobot;
Also, erstens würde ich einfach das TDatabase durch TObject ersetzen.

Du verwendest globale Variablen, um deine Daten aus der Methode Initialisieren zu speichern. Mache aus diesen Variablen (private) Felder von TRobot. Im Moment verwendet jede Instanz die gleichen Variablen, um die Werte zu speichern.

Delphi-Quellcode:
type
  TRobot = class(TObject)
  private
    FPosition: Array[1..2] of Integer;
    FWinkel_l: double;
    FSpeed: double;
  public
    procedure Initialisieren(...);
  end;
Hier "besitzt" jeder Roboter sein eigenes Variablenset, welches nur er verwenden kann. Um von aussen hierauf zugreifen zu können, verwende am besten Properties, hierbei kannst du dann eingreifen, wenn jemand den Wert lesen oder schreiben will.
  Mit Zitat antworten Zitat
SquareEnix

Registriert seit: 8. Sep 2009
15 Beiträge
 
Delphi 3 Professional
 
#8

Re: Ungewollter Zugriff auf in einem Array gespeichertes Obj

  Alt 9. Sep 2009, 09:52
Habe ich gemacht aber es kommt immer noch zu einer Zugriffsverletzung sobald eine Variable verändert werden soll, auch wenn die Veränderung in der Klasse TRobot erfolgt.
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

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

Re: Ungewollter Zugriff auf in einem Array gespeichertes Obj

  Alt 9. Sep 2009, 09:57
Zeig mal deinen kompletten Code
Markus Kinzler
  Mit Zitat antworten Zitat
SquareEnix

Registriert seit: 8. Sep 2009
15 Beiträge
 
Delphi 3 Professional
 
#10

Re: Ungewollter Zugriff auf in einem Array gespeichertes Obj

  Alt 9. Sep 2009, 09:59
Hier der Code. Die Mit >>>> Gekennzeichnete Zeile verursacht den Fehler.
Delphi-Quellcode:
unit Robot;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  DBTables;

type
  TRobot = class(TDatabase)
  private
    { Private-Deklarationen }
    Position:Array[1..2] of integer;
    Winkel_1,Speed:double;
    Ziel: TRobot;

  protected
    { Protected-Deklarationen }
  public
    procedure Zeichnen(Ziel: TBitmap);
    function WinkelBestimmen(X,Y:integer): Double;
    function PPunkt: TPoint;
    function PosX: integer;
    function PosY: integer;
    procedure PositionSetzen(X,Y: integer);
    function Winkel: double;
    procedure WinkelSetzen(NeuerWinkel: double);
    //procedure GeschwindigkeitSetzen(NeueGeschwindigkeit: double);
    procedure Initialisieren(PositionX, PositionY: integer; StartWinkel, Geschwindigkeit: double);
    procedure Step;
    procedure ZielAussuchen(Feinde: Array of TRobot; Prioritaet: integer);
    function EntfernungMessen (Zielpunkt: TPoint): double;
    procedure AufZielRichten;
    { Public-Deklarationen }
  published
    { Published-Deklarationen }
  end;


procedure Register;

implementation

procedure Register;
begin
  RegisterComponents('Robot Wars', [TRobot]);
end;

procedure TRobot.AufZielRichten;
begin
WinkelBestimmen(Ziel.PosX,Ziel.PosY);
end;

function TRobot.EntfernungMessen (Zielpunkt: TPoint): double;
var DiffX,DiffY:integer;
begin
DiffX:=Zielpunkt.x-Position[1];
DiffY:=Zielpunkt.y-Position[2];
EntfernungMessen:=Sqrt(DiffX*DiffX+DiffY*DiffY);
end;

procedure TRobot.ZielAussuchen (Feinde: Array of TRobot; Prioritaet: integer);
var i: integer; Entfernung: double;
begin
Entfernung:=1000000;
for i:= 1 to (High(Feinde))+1 do
  begin
    if EntfernungMessen(Feinde[i].PPunkt)<Entfernung then
      begin
      Entfernung:=EntfernungMessen(Feinde[i].PPunkt);
      Ziel:=Feinde[i];
      Showmessage('Ziel gewählt');
      end;
  end;
end;

procedure TRobot.Step;
begin
Position[1]:=Position[1]-Round(Sin(Winkel_1)*Speed);
Position[2]:=Position[2]-Round(Cos(Winkel_1)*Speed);

end;

procedure TRobot.Initialisieren (PositionX, PositionY: integer; StartWinkel, Geschwindigkeit: double);
begin
Position[1]:=PositionX;
Position[2]:=PositionY;
Winkel_1:=StartWinkel;
Speed:=Geschwindigkeit;
end;

procedure GeschwindigkeitSetzen(NeueGeschwindigkeit: double);
begin
//Speed:=NeueGeschwindigkeit;
end;

function TRobot.Winkel: double;
begin
Winkel:=Winkel_1;
end;

function TRobot.PPunkt: TPoint;
begin
PPunkt:=Point(Position[1],Position[2]);
end;

function TRobot.PosX: integer;
begin
PosX:=Position[1];
end;

function TRobot.PosY: integer;
begin
PosY:=Position[2];
end;

procedure TRobot.PositionSetzen(X,Y: integer);
begin
Position[1]:=X;
Position[2]:=Y;
end;

function TRobot.WinkelBestimmen(X,Y:integer): Double;
var Rid:integer; DiffX,DiffY,Plus:real;
begin
Plus:=0;
Rid:=0;
DiffX:=X-Position[1];
DiffY:=Y-Position[2];
if DiffX>0 then
  begin
  if DiffY>0 then
    Plus:=Pi/2;
  if DiffY<0 then
    begin
    Plus:=0;
    Rid:=1;
    end;
  if DiffY=0 then
    Plus:=Pi/2;
  end;
if DiffX<0 then
  begin
  if DiffY>0 then
    begin
    Plus:=Pi;
    Rid:=1;
    end;
  if DiffY<0 then
    Plus:=3*Pi/2;
  if DiffY=0 then
    Plus:=3*Pi/2;
  end;
if DiffX=0 then
  begin
  if DiffY>0 then
    begin
    Plus:=Pi;
    Rid:=1;
    end;
  if DiffY<0 then
    Plus:=2*Pi;
  if DiffY=0 then
    Plus:=0;
  end;
DiffX:=abs(DiffX);
DiffY:=abs(DiffY);
if Rid=1 then
  begin
  if DiffY=0 then
    begin
    Rid:=3;
    DiffY:=0.1;
    end;
  WinkelBestimmen:=ArcTan(DiffX/DiffY)+Plus;
  if Rid=3 then
    Winkelbestimmen:=plus;
  end
else
  begin
  if DiffX=0 then
    begin
    Rid:=2;
    DiffX:=0.1;
    end;
  WinkelBestimmen:=ArcTan(DiffY/DiffX)+Plus;
  if Rid=2 then
    Winkelbestimmen:=plus;
  end;
end;

procedure TRobot.Zeichnen(Ziel: TBitmap);
var Koord : array[1..3] of TPoint;
i :integer;
KoordX, KoordY: array[1..3] of integer;
Winkelz: array[1..3] of double;
begin
Winkelz[1]:=pi;
Winkelz[2]:=2*Pi/3+pi;
Winkelz[3]:=4*Pi/3+pi;
for i:= 1 to 3 do
  begin
  KoordX[i]:=Round(Position[1]+Sin(Winkel_1+Winkelz[i])*10);
  KoordY[i]:=Round(Position[2]+Cos(Winkel_1+Winkelz[i])*10);
  Koord[i]:=Point(KoordX[i],KoordY[i]);
  end;
Ziel.Canvas.Brush.Color:=clred;
Ziel.Canvas.Polygon(Koord);
end;

procedure TRobot.WinkelSetzen(NeuerWinkel: double);
begin
Winkel_1:=NeuerWinkel;
end;


end.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


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:22 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