AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi "array of Pointer" und eine Zugriffsverletzung...
Thema durchsuchen
Ansicht
Themen-Optionen

"array of Pointer" und eine Zugriffsverletzung...

Ein Thema von dizzy · begonnen am 4. Feb 2004 · letzter Beitrag vom 4. Feb 2004
Antwort Antwort
Benutzerbild von dizzy
dizzy

Registriert seit: 26. Nov 2003
Ort: Lünen
1.932 Beiträge
 
Delphi 7 Enterprise
 
#1

"array of Pointer" und eine Zugriffsverletzung...

  Alt 4. Feb 2004, 19:42
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
Fabian K.
INSERT INTO HandVonFreundin SELECT * FROM Himmel
  Mit Zitat antworten Zitat
jbg

Registriert seit: 12. Jun 2002
3.481 Beiträge
 
Delphi 10.1 Berlin Professional
 
#2

Re: "array of Pointer" und eine Zugriffsverletzung

  Alt 4. Feb 2004, 19:52
Zitat:
SolarSystems[SolarSystemCount] := @TSolarSystem.Create;
Ich weiß zwar nicht, was du mit der Speicheradresse des Konstruktors TSolarSystem.Create anfangen willst, ...

Mit
var x: TSolarSystem; hast du bereits einen Zeiger. Mit
var x: ^TSolarSystem; hast du also einen Zeiger auf einen Zeiger auf ein TSolarSystem Objekt.
  Mit Zitat antworten Zitat
Benutzerbild von dizzy
dizzy

Registriert seit: 26. Nov 2003
Ort: Lünen
1.932 Beiträge
 
Delphi 7 Enterprise
 
#3

Re: "array of Pointer" und eine Zugriffsverletzung

  Alt 4. Feb 2004, 19:59
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
Fabian K.
INSERT INTO HandVonFreundin SELECT * FROM Himmel
  Mit Zitat antworten Zitat
jbg

Registriert seit: 12. Jun 2002
3.481 Beiträge
 
Delphi 10.1 Berlin Professional
 
#4

Re: "array of Pointer" und eine Zugriffsverletzung

  Alt 4. Feb 2004, 20:03
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?
  Mit Zitat antworten Zitat
Benutzerbild von Sanchez
Sanchez

Registriert seit: 24. Apr 2003
Ort: Neumarkt Stmk
892 Beiträge
 
Delphi XE6 Enterprise
 
#5

Re: "array of Pointer" und eine Zugriffsverletzung

  Alt 4. Feb 2004, 20:06
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
Daniel
Testen ist feige!
  Mit Zitat antworten Zitat
Benutzerbild von dizzy
dizzy

Registriert seit: 26. Nov 2003
Ort: Lünen
1.932 Beiträge
 
Delphi 7 Enterprise
 
#6

Re: "array of Pointer" und eine Zugriffsverletzung

  Alt 4. Feb 2004, 20:09
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
Fabian K.
INSERT INTO HandVonFreundin SELECT * FROM Himmel
  Mit Zitat antworten Zitat
jbg

Registriert seit: 12. Jun 2002
3.481 Beiträge
 
Delphi 10.1 Berlin Professional
 
#7

Re: "array of Pointer" und eine Zugriffsverletzung

  Alt 4. Feb 2004, 20:12
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;
  Mit Zitat antworten Zitat
Benutzerbild von Leuselator
Leuselator

Registriert seit: 18. Mär 2003
Ort: Berlin
589 Beiträge
 
Delphi 8 Architect
 
#8

Re: "array of Pointer" und eine Zugriffsverletzung

  Alt 4. Feb 2004, 20:13
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ß
Tim Leuschner
Programmierer = moderner Sysiphos: stets wenn er meint, den Stein seiner Dummheit auf den Berg des Wissens gewuchtet zu haben, erblickt er einen völlig neuen Aspekt und der Dummfels poltert mit Getöse zurück ins Tal der Unwissenheit...
  Mit Zitat antworten Zitat
Benutzerbild von dizzy
dizzy

Registriert seit: 26. Nov 2003
Ort: Lünen
1.932 Beiträge
 
Delphi 7 Enterprise
 
#9

Re: "array of Pointer" und eine Zugriffsverletzung

  Alt 4. Feb 2004, 20:14
AH ... OOHH ...

hätte man wissen können... Dankeee! (puh, das hat meinen Abend gerettet!)


Herzlich,
dizzy
Fabian K.
INSERT INTO HandVonFreundin SELECT * FROM Himmel
  Mit Zitat antworten Zitat
Benutzerbild von Leuselator
Leuselator

Registriert seit: 18. Mär 2003
Ort: Berlin
589 Beiträge
 
Delphi 8 Architect
 
#10

Re: "array of Pointer" und eine Zugriffsverletzung

  Alt 4. Feb 2004, 20:16
...
Tim Leuschner
Programmierer = moderner Sysiphos: stets wenn er meint, den Stein seiner Dummheit auf den Berg des Wissens gewuchtet zu haben, erblickt er einen völlig neuen Aspekt und der Dummfels poltert mit Getöse zurück ins Tal der Unwissenheit...
  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 18: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