Autor Beitrag
Xion
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
EE-Maler
Beiträge: 1952
Erhaltene Danke: 128

Windows XP
Delphi (2005, SmartInspect), SQL, Lua, Java (Eclipse), C++ (Visual Studio 2010, Qt Creator), Python (Blender), Prolog (SWIProlog), Haskell (ghci)
BeitragVerfasst: Di 22.04.14 18:02 
Da fallen mir mehrere Möglichkeiten ein:

:arrow: Du benutzt einen Zeiger auf den Zeiger. Dann steckt hinter dem zeiger entweder das Objekt oder nil. Alle Zeiger zeigen dann auf das nil.
:arrow: Du machst ein Record mit Spielfeld und SpielfeldExists. Darauf hast du deine Pointer (das ist so ungefähr das selbe wie der vorherige Punkt ;) )
:arrow: Du machst deine Klasse als Singleton und benutzt eine class function zum Test, ob die Instanz existiert. Dann kannst du aber immer nur ein Spielfeld haben!

_________________
a broken heart is like a broken window - it'll never heal
In einem gut regierten Land ist Armut eine Schande, in einem schlecht regierten Reichtum. (Konfuzius)
IhopeonlyReader Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 600
Erhaltene Danke: 23


Delphi 7 PE
BeitragVerfasst: Mi 23.04.14 12:06 
ich mache das fast so wie du sagst Xion...

ich habe ja sowohl den gegnersockert als auch das spielfeld als pointer...
somit mache ich es so
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
  //grobe skizzierung
-> Spieler.Gegner.Spielfeld := nil;
-> Spieler.Spielfeld.Free;
-> Spieler.Spielfeld := nil;
{Spieler.Gegner.Gegner := nil;
Spieler.Gegner := nil;}

_________________
Sucht "neueres" Delphi :D
Wer nicht brauch was er hat, brauch auch nicht was er nicht hat!
Xion
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
EE-Maler
Beiträge: 1952
Erhaltene Danke: 128

Windows XP
Delphi (2005, SmartInspect), SQL, Lua, Java (Eclipse), C++ (Visual Studio 2010, Qt Creator), Python (Blender), Prolog (SWIProlog), Haskell (ghci)
BeitragVerfasst: Mi 23.04.14 14:56 
Du könntest es in etwa so machen:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
type TSpielfeld = class
end;
type PSpielfeld = ^TSpielfeld;

type TSpieler = record
  Spielfeld: ^PSpielfeld; //pointer auf pointer zum Spielfeld
end;

procedure RunTest;
var spieler1, spieler2: TSpieler;
    ptrSpielfeld: PSpielfeld; //d.h. ist ein Pointer
begin
  Spielfeld^ := TSpielfeld.Create;
  spieler1.Spielfeld := @ptrSpielfeld;
  spieler2.Spielfeld := @ptrSpielfeld;
  ptrSpielfeld^.Free;
  ptrSpielfeld:= nil;
  if spieler1.Spielfeld^ <> nil then
    ShowMessage('Dieser Code funktioniert nicht wie Xion sich das vorstellt!');
end;


Nicht vergessen: ptrSpielfeld wird ungültig bei Verlassen der Funktion, dies ist nur ein Test und wenn du das so einsetzen willst muss da der Pointer "global" hinterlegt werden. Man könnte ihn sogar ins Spielfeld integrieren und eine Funktion "getReference" oder so dafür schreiben. Ganz wie man möchte.

_________________
a broken heart is like a broken window - it'll never heal
In einem gut regierten Land ist Armut eine Schande, in einem schlecht regierten Reichtum. (Konfuzius)
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19277
Erhaltene Danke: 1741

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Do 24.04.14 06:17 
In der ersten Zeile meinst du vermutlich ptrSpielfeld^ und nicht Spielfeld^, oder?
Trotzdem ist das falsch. Denn das Ziel des Pointers ist nicht initialisiert, so dass da einfach irgendwelcher Speicher überschrieben wird...
Der Speicher muss in so einem Fall explizit, z.B. mit GetMem, initialisiert werden oder eine Variable als Ziel benutzt werden, auf die der Pointer zeigt (ich vermute mal du hattest letzteres im Sinn).

Die ganze Pointerspielerei halte ich aber ohnehin für wenig sinnvoll. Mit Interfaces kann man das auch erreichen. Wenn man das Spielfeld wirklich gezielt zerstören möchte, kann man ein Interface nutzen, in dem der Pointer liegt.

Viel sinnvoller ist aber vermutlich das Spielfeld einfach direkt als Pointer umzusetzen, damit jeder darauf so lange zugreifen kann wie er es braucht. Selbst wenn die visuelle Darstellung schon nicht mehr existiert, kann das Spielfeld dahinter ja noch weiter leben um z.B. die Endstände noch abrufen zu können.

Für diesen Beitrag haben gedankt: Xion
Xion
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
EE-Maler
Beiträge: 1952
Erhaltene Danke: 128

Windows XP
Delphi (2005, SmartInspect), SQL, Lua, Java (Eclipse), C++ (Visual Studio 2010, Qt Creator), Python (Blender), Prolog (SWIProlog), Haskell (ghci)
BeitragVerfasst: Do 24.04.14 13:34 
Oh, danke für die Korrektur. :oops:
Habs eben mal ausprobiert, es war viel zu kompliziert gedacht:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
var spieler1, spieler2: TSpieler;
    ptrSpielfeld: PSpielfeld; //d.h. ist ein Pointer
    Spielfeld: TSpielfeld;
begin
  Spielfeld := TSpielfeld.Create;
  spieler1.Spielfeld := @Spielfeld;
  spieler2.Spielfeld := @Spielfeld;
  Spielfeld.Free;
  Spielfeld := nil//<< Spielfeld wird gelöscht
  if spieler1.Spielfeld^ = nil then //<< Pointer darauf "erfahren" dabei von der Änderung.
    ShowMessage('Dieser Code funktioniert wie Xion sich das vorstellt!');
end;

Hinter Spielfeld verbirgt sich natürlich bereits ein Pointer auf die eigentliche Struktur (deswegen ja auch call by reference, wenn man eine Klasse als Parameter übergibt). Sollte jetzt aber so passen, solange die variable Spielfeld global verwaltet wird.

_________________
a broken heart is like a broken window - it'll never heal
In einem gut regierten Land ist Armut eine Schande, in einem schlecht regierten Reichtum. (Konfuzius)