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 ... oder so (https://www.delphipraxis.net/140896-array-pointer-oder-so.html)

Schilly 28. Sep 2009 14:00


Array of Pointer ... oder so
 
Moinmoin,

Ich wollte mal Minesweeper programmieren und dafür eine klasse TMineButton (von TSpeedButton abgeleitet) und eine klasse TMineField (von TPanel) machen. unter anderem sollte ein TMineButton 8 "Neighbours" haben, also die buttons um ihn herum. Jetzt wollte ich mal ausprobieren, wie das mit pointern geht, also sollte es ungefähr so aussehen:
Delphi-Quellcode:
type TMineButton = class(TSpeedButton)
  private
    fNeighbour : array[0..7] of Pointer;

...

function TMineButton.GetNeighbour(Index : Integer) : Pointer;
begin
  Result := fNeighbour[Index];
end;

procedure TMineButton.SetNeighbour(Index: Integer; P: Pointer);
begin
  fNeighbour[Index] := P;
end;
zuerst hatte ich halt anstatt pointer überall ^TMineButton
eine routine aus TMineField sollte dann einem Button später automatisch die addresse der benachbarten buttons als neighbour zuweisen ...
aber irgendwie klappt das nicht ^^ es kommt ein EStackOverflow ...

kann mir jemand sagen, wie es richtig geht? oder sollte man einfach ein array der koordinaten der benachbarten buttons machen, weil es so nicht geht?

vielen dank im vorraus

Gruber_Hans_12345 28. Sep 2009 14:03

Re: Array of Pointer ... oder so
 
einfach statt Pointer TSpeedButton verwenden ... bzw TMineButton

Schilly 28. Sep 2009 14:07

Re: Array of Pointer ... oder so
 
ja ... aber verbraucht das nicht zuviel speicher? - wäre jetzt meine frage gewesen, wobei mir grade einfällt dass es dann wahrscheinlich gar nicht neu gespeichert wird .. so wie arrays, oder? ^^

hm ok, also gar nicht mit pointern ...
danke

Schilly 28. Sep 2009 14:09

Re: Array of Pointer ... oder so
 
habs grad geändert, Stack Overflow gibts trotzdem ...

guidok 28. Sep 2009 14:23

Re: Array of Pointer ... oder so
 
Zitat:

Zitat von Schilly
ja ... aber verbraucht das nicht zuviel speicher? - wäre jetzt meine frage gewesen, wobei mir grade einfällt dass es dann wahrscheinlich gar nicht neu gespeichert wird .. so wie arrays, oder? ^^

hm ok, also gar nicht mit pointern ...
danke

Delphi-Quellcode:
var
  Mine1, Mine2: TMineButton;

  Mine1 := TMineButton.Create; //Damit wird eine Instanz von TMineButton erzeugt und der Speicher entsprechend reserviert. Mine1 enthält nun einen Zeiger auf die Daten.

  Mine2 := Mine1; //Damit wird nur der Zeiger, der auf Mine1 zeigt Mine2 zugewiesen, d.h. Mine1 und Mine2 zeigen nun auf die gleiche Instanz.
Ich würde gar kein Array mit Nachbarn verwenden, sonder jeder Mine ihre Koordinate im Minenfeld mitgeben. Daraus kann sie sich dann die Nachbarn errechnen:

Mine mit den Koordinaten x/y

Nachbarn: x-1/y-1
x-1/y
x-1/y+1
usw.

Du musst natürlich noch kontrollieren, ob die Koordinate nicht an die Grenze des Minenfeldes stößt und der Mine eine Referenz auf das komplette Minenfeld mitgeben.

Schilly 28. Sep 2009 14:35

Re: Array of Pointer ... oder so
 
ok, dieses verständnis von zeigern und objektnamen hatte ich noch nicht ... danke

ja, ich hab die koordinaten haben sie auch schon, ich dachte nur mit pointer wäre es eleganter und einfacher zu lösen ...
aber gut wenn es nicht einfacher geht, dann danke ich euch und einen schönen tag noch. ^^

spaxxn 28. Sep 2009 14:42

Re: Array of Pointer ... oder so
 
Hab das mal mit einem mehrdimensionalen Array geschrieben, wo an jeder Stelle über Bits der Status des jeweiligen Feldes steht. Die Lösung an sich war praktikabel und über die Indizes im Array, konnte man auch sofort auf die Nachbarn und deren Status zugreifen.

Falsch finde ich ein Array für dieses Spiel wirklich nicht.

himitsu 28. Sep 2009 14:44

Re: Array of Pointer ... oder so
 
Zitat:

Zitat von Schilly
ich dachte nur mit pointer wäre es eleganter und einfacher zu lösen

eine Objektvariable ist sozusagen schon selber ein Pointer auf das zugehörige Objekt.

PS: wie hattest du denn deine Pointer referenziert?
(hoffentlich nicht über lokale Variablen)


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