Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi Zugriffsverletzung bei Adresse ... (https://www.delphipraxis.net/160758-zugriffsverletzung-bei-adresse.html)

Informatik2012 30. Mai 2011 10:53

Zugriffsverletzung bei Adresse ...
 
Also folgendes Problem. Wir haben ein freies Projekt auf, und haben uns für ein Labyrinth-Spiel entschieden. Aber alleine schon nur beim Spielsystem tritt der Fehler "zugriffsverletzung bei adresse 00411C1A".
Der für den Fehler relevante Quellcode ist wie folgt:
Delphi-Quellcode:
unit game;

interface

type TFeld = class(TObject)
          private
           fx_koo : integer;
           fy_koo : integer;
           l_wand: boolean;
           r_wand: boolean;
           o_wand: boolean;
           u_wand: boolean;
           schatz: boolean;

          public
           property x_koo : integer read fx_koo;
      property y_koo : integer read fy_koo;
           procedure set_koo(x,y : integer);

      property owand : boolean read o_wand;
      property lwand : boolean read l_wand;
      property rwand : boolean read r_wand;
           property uwand : boolean read u_wand;
      procedure set_wand(o,u,r,l : boolean);
     end;

type TMensch = class(TObject)
          private
           fx_koo        : integer;
           fy_koo        : integer;
           schatz        : boolean;
           IP_private    : integer;
           bewegen       : boolean;
           anzahl_bewegen : integer;

          public
      property x_koo : integer read fx_koo;
      property y_koo : integer read fy_koo;
      procedure set_koo(x,y : integer);
      property IP : integer read IP_private;
      procedure set_IP(IP:integer);
     end;

     TMap= array of array of TFeld;

function generiere_karte(x_Laenge,y_Laenge : integer):TMap;
procedure loesche_karte(Map: TMap);


function generiere_mensch(IP,x,y: integer):TMensch;
procedure loesche_mensch(Mensch :TMensch);
function laufe_oben(Mensch : TMensch; Map : TMap):boolean;
function laufe_unten(Mensch : TMensch; Map : TMap):boolean;
function laufe_rechts(Mensch : TMensch; Map : TMap):boolean;
function laufe_links(Mensch : TMensch; Map : TMap):boolean;
function bewegen(Mensch : TMensch):boolean;
Das ist die Typen-Deklaration. Und die Fehlerrelevanten Funktionen:
Delphi-Quellcode:
procedure TFeld.set_koo(x,y : integer);
begin
 fx_koo :=x;
 fy_koo :=y;
end;

procedure TFeld.set_wand(o,u,r,l : boolean);
begin
 o_wand := o;
 u_wand := u;
 r_wand := r;
 l_wand := l;
end;

procedure TMensch.set_koo(x,y : integer);
begin
 fx_koo :=x;
 fy_koo :=y;
end;

procedure TMensch.set_IP(IP : integer);
begin
 IP_private := IP;
end;

function generiere_karte(x_Laenge,y_Laenge : integer):TMap;
var i,k,i2,k2 : integer;
begin
 i2:=0;
 k2:=0;
 SetLength(Result,x_Laenge,y_Laenge);
 for i:=0 to x_laenge-1 do
 begin
  for k:=0 to y_Laenge-1 do
  begin
   Result[i,k]:=TFeld.Create;
   with Result[i,k] do
   begin
    fx_koo:=i2;
    fy_koo:=k2;
    set_wand(False,False,False,False);
    schatz:=False;
(*    if i=0 then o_wand:=true;
    if i=x_laenge-1 then u_wand:=true;
    if k=0 then l_wand := true;
    if k=y_laenge-1 then r_wand:= true;  *)
   end;
  inc(k2);
  end;
  inc(i2);
 end;
end;

function generiere_mensch(IP,x,y: integer):TMensch;
begin
 Result.Create;
 Result.IP_private := IP;
 Result.set_koo(x,y);
 Result.anzahl_bewegen := 0;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
 x:=20;
 y:=20;
 Map:=generiere_karte(10,10);
 Mensch1:=generiere_mensch(1,1,1);
 PaintBox1.Color:=clWhite;
 Paintbox1.Canvas.Rectangle(x,y,x+20,y+20);
end;
Nach dem Klicken des Buttons wird nicht gezeichnet und die Fehlermeldung kommt nach einiger Zeit.

DeddyH 30. Mai 2011 10:56

AW: Zugriffsverletzung bei Adresse ...
 
Zitat:

Delphi-Quellcode:
Result.Create;

-->
Delphi-Quellcode:
Result := TMensch.Create;

schlecki 30. Mai 2011 11:29

AW: Zugriffsverletzung bei Adresse ...
 
oder noch besser, gleich einen richtigen Konstruktor bauen...

Zitat:

Zitat von Informatik2012 (Beitrag 1103672)
Delphi-Quellcode:
  type TMensch = class(TObject)
  private
    //fx_koo        : integer;
    //fy_koo        : integer;
    FCoords: TPoint;
    schatz        : boolean;
    IP_private    : integer;
    bewegen       : boolean;
    anzahl_bewegen : integer;
  public
    constructor Create(const IP: Integer; const Coords: TPoint); reintroduce;
//    property x_koo : integer read fx_koo;
//    property y_koo : integer read fy_koo;
    property Coords: TPoint read FCoords;
    procedure set_koo(x,y : integer);
    property IP : integer read IP_private;
    procedure set_IP(IP:integer);
 end;

constructor TMensch.Create(const IP: Integer; const Coods: TPoint);
begin
  inherited Create();
  FIP := IP;
  FCoords := Coords;
end;

und dann einfach
Delphi-Quellcode:
Mensch := TMensch.Create(127, TPoint(0, 0));

shmia 30. Mai 2011 11:37

AW: Zugriffsverletzung bei Adresse ...
 
Die Klassen TFeld und TMensch haben gemeinsame Properties.
Daher sollte man eine gemeinsame Basisklasse einführen.


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