Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Fr Jul 04, 2025 21:54

Foren-Übersicht » Programmierung » Allgemein
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 23 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Autor Nachricht
 Betreff des Beitrags: Pointer auf eine Klasse?...
BeitragVerfasst: Mi Mai 13, 2009 15:47 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Okt 27, 2003 17:46
Beiträge: 788
Hallo!

Folgendes Problem liegt bei mir an...
Im Normalfall kann man ja einen Pointer der Klasse1 durch:
Klasse2 := Klasse1;
setzen... wenn ich nun Klasse2 aufrufe, bekomme ich den inhalt von Klasse1 oder? bzw. werde darauf hin verwiesen...

Ich versuchte es jetzt so:


Code:
  1.  
  2.  
  3.  
  4. TPlayer = class(TObject)
  5. public
  6.   //constructor Create; override;
  7.   procedure AddPlanet(aPlanet: TPlanet);
  8.   //destructor Destroy; override;
  9. public
  10.   IP: string;
  11.   Planets: array of TPlanet;                 // ####### Dieser array soll am ende nur Pointer auf andere Klassen haben, die unten gezeigt werden....
  12. end;
  13.  
  14. TPlayerCon = class(TObject)
  15. public
  16.   //constructor Create; override;
  17.   function Add():integer;
  18.   procedure SetStartPlanet();
  19.   destructor Destroy; override;
  20.  
  21. public
  22.   PlayerCon: array of TPlayer;
  23. end;
  24. implementation
  25.  
  26. {constructor TPlayerCon.Create;
  27. begin
  28.  
  29. end;}
  30.  
  31. function TPlayerCon.Add():integer;                                   // ####### <---- Diese funktion rufe ich auf
  32. var
  33.   temp_LastPlayer: integer;
  34. begin
  35.   setlength(PlayerCon,high(PlayerCon)+2);
  36.  
  37.   temp_lastplayer := high(PlayerCon);
  38.   PlayerCon[temp_lastplayer] := TPlayer.Create();
  39.  
  40.   result := temp_lastplayer;
  41. end;
  42.  
Code:
  1.  
  2. //-----------------------------------------------------------------------------------------------------------------------------------------------------------------------
  3.  
  4. Spieler.PlayerCon[l].AddPlanet(Planeten.Planets[l]);              // ####### So rufe ich oben stehende funktion auf
  5.  
  6. //-----------------------------------------------------------------------------------------------------------------------------------------------------------------------
  7.  
Code:
  1.  
  2.  
  3. Tplanetcon = class(TObject)
  4. public
  5.   procedure AddPlanet(PlanetInfo: Tplanet);
  6.   function  GetSelected():Tplanet;
  7.   function  GetCount():integer;
  8.   procedure RemovePlanet(PlanetNumber: integer);
  9.   procedure RemoveAllPlanets();
  10.   procedure SetStartPlanetRec(aPlayerCount: integer);
  11.   procedure CreateGalaxy(PlanetenZahl: integer; GalaxySize: integer; MinAbstand: smallint);
  12.   //procedure RemovePlanet(PlanetName: string);
  13. public
  14.   Planets: array of Tplanet;                                                 // ####### Hier drauf sollen die Verweise verweisen <!-- s;-) --><img src=\"{SMILIES_PATH}/icon_wink.gif\" alt=\";-)\" title=\"Wink\" /><!-- s;-) -->
  15.   SelPlanet: integer;
  16. end;
  17.  
  18.  
Code:
  1.  
  2.  
  3. procedure TPlayer.AddPlanet(aPlanet: TPlanet);
  4. begin
  5.  
  6.   SetLength(Planets,high(Planets)+2);
  7.   Planets[high(planets)+1] := aPlanet;
  8.  
  9. end;
  10.  
  11.  


Aber wenn ich jetzt beim "debuggen" mit der maus über -- PlayerCon[l] -- gehe, dann zeigt er mir an das eine klasse existiert, aber das die werte alle = 0 sind.
Obwohl er mir die richtigen werte anzeigt, wenn ich auf -- Planeten.Planets[l] -- gehe... Wie bekomme ich das in den Griff??

_________________
www.audi32.de


Zuletzt geändert von Adler am Mi Mai 13, 2009 18:26, insgesamt 1-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Mai 13, 2009 17:08 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Zunächst einmal redest du von Objekten und nicht von Klassen - das war das erste, was mich verwirrt hat. Das zweite: Irgendwie passt der Inhalt deiner Add-Funktion nicht zu dem, was sie zu sein scheint, wenn ich mir den Aufruf anschaue. Erstmal ist der Name ein anderer (Add <=> AddPlanet; ganz zu schweigen von dem fehlenden Paramter). Dann arbeitest du da mit einem Array, welches irgendwie mehr nach Playern als nach Planeten aussieht. Das könnte eventuell auch der Grund für komische Werte sein.

Gruß Lord Horazont

_________________
If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung.
current projects: ManiacLab; aioxmpp
zombofant networkmy photostream
„Writing code is like writing poetry“ - source unknown


„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Mai 13, 2009 17:17 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mär 30, 2007 18:35
Beiträge: 331
Im Grunde genommen ist es so:



Code:
  1.  
  2. var
  3.   object1, object2: TObject;
  4.  
  5. object1:= TObject.Create(); //object1 ist jetzt ein Zeiger auf eine neue Instanz von TObject
  6. object2:= object1; //object2 ist jetzt ein Zeiger auf die gleiche Instanz wie object1
  7.  


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Mai 13, 2009 18:22 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Mir ist klar, dass es im grunde genommen so sein sollte.
Das Problem ist aber, dass es offensichtlich nicht so ist, denn sonst würde es funktionieren. Ich empfehle, einfach mal step by step durch den Code zu debuggen (am besten, per Breakpoint vor dem Aufruf der Add-Methode einspringen) und dann schauen, was da genau passiert. Wie gesagt, was du da gepostet hast, scheint mir überhaupt nicht zusammen zu passen.

Gruß Lord Horazont

_________________
If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung.
current projects: ManiacLab; aioxmpp
zombofant networkmy photostream
„Writing code is like writing poetry“ - source unknown


„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Mai 13, 2009 18:23 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Okt 27, 2003 17:46
Beiträge: 788
Sorry :-/

Diese hier:

Code:
  1. procedure TPlayer.AddPlanet(aPlanet: TPlanet);
  2. begin
  3.  
  4.   SetLength(Planets,high(Planets)+2);
  5.   Planets[high(planets)+1] := aPlanet;
  6.  
  7. end;


EDIT: Im prinzip sollen die spieler alle planeten, die sie erobert haben als pointer in ein array bekommen... :-)
und AddPlanet(planet auf den verweist werden soll) soll das machen...

_________________
www.audi32.de


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Mai 13, 2009 18:53 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
High() gibt, anders als Length (gibt die Länge zurück, muss man also minus 1 rechnen, um auf den größtmöglichen Index zu kommen), den größtmöglichen Index zurück. Darauf noch +1 zu rechnen, ist wahrscheinlich keine gute Idee.

Gruß Lord Horazont

_________________
If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung.
current projects: ManiacLab; aioxmpp
zombofant networkmy photostream
„Writing code is like writing poetry“ - source unknown


„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Mai 13, 2009 19:07 
Offline
DGL Member

Registriert: Sa Nov 24, 2007 11:59
Beiträge: 116
Programmiersprache: FreePascal
da sind mir wieder zu viele rechnungen drin. machs doch einfach so:

Code:
  1.  
  2. procedure TPlayer.AddPlanet(aPlanet: TPlanet);
  3. begin
  4.     SetLength(Planets, length(Planets) + 1);
  5.     Planets[high(planets)] := aPlanet;
  6. end;


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Mai 13, 2009 19:45 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Ohne konkret zu wissen wie es in Delphi ist,

aber ein Array zu verlängern ist ziemlich unperformant. Nutz doch lieber eine Liste. Die ist dazu da um dynamische Speicher zu verwalten. Und du kannst leicht sachen ranhängen und wieder rauslöschen.

_________________
Blog: kevin-fleischer.de und fbaingermany.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Mai 13, 2009 20:19 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Jan 04, 2008 21:29
Beiträge: 419
Wohnort: Lübeck
eine Liste hat dafür aber einen enorm größeren Zeitaufwand beim wiederfinden der Daten. Man muss an der Stelle also gucken was man lieber hat:

1. Zeitaufwand beim umschaufeln der Planeten in ein größeres Array
2. Zeitaufwand beim suchen eines Planeten

kommt also drauf an, wie oft gelesen wird und wie oft Daten rein/rauß gehen bei dem Array/der Liste

_________________
Klar Soweit?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Mai 13, 2009 20:56 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mär 30, 2007 18:35
Beiträge: 331
Man kann das Array auch gleich um 32 oder mehr Einträge, was der Umstand halt hergibt, erweitern. Das verbraucht zwar mehr Speicher, bei Pointern aber eher zu vernachlässigen. Man muss halt eine zusätzliche Variable anlegen, die angibt wie viele "echte" Einträge dabei sind.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Mai 13, 2009 21:30 
Offline
Forenkatze
Benutzeravatar

Registriert: Mi Okt 22, 2003 18:30
Beiträge: 1945
Wohnort: Närnberch
Programmiersprache: Scala, Java, C*
@Sellmann, woher nimmst du deine Behauptung? ^^
Die TList in Delphi ist genau so schnell wie jedes andere array, ist im Hintergrund ja schließlich auch ein Array am Werkeln ;) Es ist keine verlinkte Liste, was du vielleicht vermutest.
Pardon, sie ist natürlich schneller, weil sie seltener vergrößert werden muss *g*

@Markus: Oder gleich TList verwenden... Das macht haargenau das.

_________________
"Für kein Tier wird so viel gearbeitet wie für die Katz'."


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Mai 13, 2009 21:59 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Jan 04, 2008 21:29
Beiträge: 419
Wohnort: Lübeck
das die TList keine Liste sondern ein getarntes Array ist habe ich auch gerade gemerkt. ganz schön schwach...

_________________
Klar Soweit?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Mai 13, 2009 22:10 
Offline
DGL Member
Benutzeravatar

Registriert: Di Jul 29, 2003 00:11
Beiträge: 436
Wieso schwach? Dass das keine echte verkettete Liste ist?
Je nach Anwendungsfall ist mal das eine, mal das andere besser.
Willst du auf beliebige Elemente zugreifen? -> Array, da du nicht über die Liste iterieren musst.
Fügst du oft Sachen hinzu / löschst welche? -> Liste, da nur an- / umgehängt werden muss.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Mai 14, 2009 05:45 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Jan 04, 2008 21:29
Beiträge: 419
Wohnort: Lübeck
ich meine mit schwach, dass einem in Delphi n Array als linkedList verkauft wird. Was bringt es dir zu wissen wie du auf die Daten zugreifen willst, wenn sich hinter einem Namen nicht das verbirgt was man vermutet?

_________________
Klar Soweit?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Mai 14, 2009 08:39 
Offline
Forenkatze
Benutzeravatar

Registriert: Mi Okt 22, 2003 18:30
Beiträge: 1945
Wohnort: Närnberch
Programmiersprache: Scala, Java, C*
Wird es doch gar nicht. Wo soll das denn bei Delphi stehen, dass TList eine verkettete Liste wäre?

_________________
"Für kein Tier wird so viel gearbeitet wie für die Katz'."


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 23 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Foren-Übersicht » Programmierung » Allgemein


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 3 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.011s | 14 Queries | GZIP : On ]