Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi "array of Pointer" und eine Zugriffsverletzung... (https://www.delphipraxis.net/15835-array-pointer-und-eine-zugriffsverletzung.html)

dizzy 4. Feb 2004 19:42


"array of Pointer" und eine Zugriffsverletzung...
 
Hi liebe Leut'!
Ich komme gleich mal zum Punkt...

Folgende Deklaration:

Delphi-Quellcode:
type
  PSolarSystem = ^TSolarSystem;

  TUniverse = class(TObject)
  public
   Width, Height : Int64;
   SolarSystems : array of PSolarSystem;
   SolarSystemCount : integer;
   constructor Create;
   procedure addSolarSystem(Fx, Fy: Int64; planetCount: integer);
  end;

  TEntity = class(TObject);
  TSolarSystem = class(TEntity)
  public
    X, Y : Int64;
    constructor Create;
    procedure init(Fx, Fy: Int64; planetsTotal: integer);
  end;


implementation

constructor TUniverse.Create;
begin
  inherited;
  Width := 10000;
  Height := 10000;
  SetLength(SolarSystems, 10);
  SolarSystemCount := 0;
end;

procedure TUniverse.addSolarSystem(Fx, Fy: Int64; planetCount: integer);
begin
  SolarSystems[SolarSystemCount] := @TSolarSystem.Create;
  SolarSystems[SolarSystemCount].init(Fx, Fy, planetCount);
  inc(SolarSystemCount);
end;


constructor TSolarSystem.Create;
begin
  inherited;
end;

procedure TSolarSystem.init(Fx, Fy: Int64; planetsTotal: integer);
begin
  X := Fx; <----- HIER DIE ZURGIFFSVERLETZUNG !!!
  Y := Fy;                        
  SetLength(Planets, planetsTotal);
  planetCount := 0;              
end;

end.

Und aufgerufen wird so:

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var u : TUniverse;
begin
  u := TUniverse.Create;
  u.addSolarSystem(0, 0, 5);
end;

Simple Frage: Warum knallts?

Vielen Dank im Voraus,
dizzy

jbg 4. Feb 2004 19:52

Re: "array of Pointer" und eine Zugriffsverletzung
 
Zitat:

SolarSystems[SolarSystemCount] := @TSolarSystem.Create;
Ich weiß zwar nicht, was du mit der Speicheradresse des Konstruktors TSolarSystem.Create anfangen willst, ...

Mit
Delphi-Quellcode:
var x: TSolarSystem;
hast du bereits einen Zeiger. Mit
Delphi-Quellcode:
var x: ^TSolarSystem;
hast du also einen Zeiger auf einen Zeiger auf ein TSolarSystem Objekt.

dizzy 4. Feb 2004 19:59

Re: "array of Pointer" und eine Zugriffsverletzung
 
Hi!
SolarSystems ist ein array of PSolarSystem (= ^TSolarSystem).
Daher kann ich ja leider nicht:
SolarSystems[counter] := TSolarSystem.Create;
aufrufen, sondern muss einen Zeiger (also Adresse) abliefern. Wobei das Create ja an sich bereits nur einen Zeiger abliefert, aber der Compiler meckert, dass TSolarSystem <> PSolarSystem (was ja an sich auch korrekt ist). Wie müsste ich umschreiben, dass etwas derartiges klappt?

Holdrioh,
dizzy

jbg 4. Feb 2004 20:03

Re: "array of Pointer" und eine Zugriffsverletzung
 
Mach aus dem PSolarSystem ein TSolarSystem. Oder hat das einen besondern Grund, warum du Zeiger auf Variablen vom Typ TSolarSystem in dem Array speichern willst?

Sanchez 4. Feb 2004 20:06

Re: "array of Pointer" und eine Zugriffsverletzung
 
Vermutlich hast du früher C gelernt. Da braucht man Pointer auf Objekte.
Bei Delphi stellt eine Variable vom Typ TSolarSystem bereits einen Pointer auf das Objekt dar.
Es besteht also keine Notwendigkeit für dein PSolarSystem.

grüße, daniel

dizzy 4. Feb 2004 20:09

Re: "array of Pointer" und eine Zugriffsverletzung
 
Ich habe öfters die Situation, dass sich dieKkatze in den Schwanz beissen würde.

Delphi-Quellcode:
type
  POne = ^TOne;
  PTwo = ^TTwo;
 
  TOne = class(TObject)
  public
    Two : array of PTwo;
  end;

  TTwo = class(TObject)
  public
    One : POne;
  end;
Sowas in der Art.
Und zum Zeitpunkt der Deklaration von TOne ist TTwo noch nicht bekannt. Also per Pointer. Würde ich anders herum deklarieren, wäre das Problem das selbe.
Diese Problematik erwartet mich jetzt gleich mehrfach, und ich wollte gerne an möglichst allen Stellen so arbeiten, damit es einheitlicher wird.

gruss,
dizzy


\\edit: @Sanchez: Nö, C ist mir nicht nur fremd, sondern gar Wiederlich. Nie wirklich was damit gemacht ;)

jbg 4. Feb 2004 20:12

Re: "array of Pointer" und eine Zugriffsverletzung
 
Delphi besitzt da so ein kleines Feature, dass sich class forward declaration nennt.

Delphi-Quellcode:
TSecondClass = class; // forward Deklaration

TFirstClass = class(TObject)
private
  FField: TSecondClass;
...
end;

TSecondClass = class(TObject)
private
  FField: TFirstClass; // oder auch was anderes je nach Nutzen
...
end;

Leuselator 4. Feb 2004 20:13

Re: "array of Pointer" und eine Zugriffsverletzung
 
dann versuch doch mal das:
Delphi-Quellcode:
type
  TOne = class;
  TTwo = class;

  TOne = class(TObject)
  public
    Two : array of TTwo;
  end;

  TTwo = class(TObject)
  public
    One : TOne;
  end;
sollte der Katze den Schwanz aus dem Maul zerren :-) oder bin ich da auf'm falschen Dampfer?
Gruß

dizzy 4. Feb 2004 20:14

Re: "array of Pointer" und eine Zugriffsverletzung
 
AH ... OOHH ...
:oops:
hätte man wissen können... Dankeee! (puh, das hat meinen Abend gerettet!)


Herzlich,
dizzy

Leuselator 4. Feb 2004 20:16

Re: "array of Pointer" und eine Zugriffsverletzung
 
...


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