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

Aktuelle Zeit: Mi Jul 09, 2025 16:09

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



Ein neues Thema erstellen Auf das Thema antworten  [ 7 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Klassen und Zeiger
BeitragVerfasst: Mo Dez 14, 2009 17:45 
Offline
DGL Member

Registriert: Mi Okt 21, 2009 14:02
Beiträge: 22
Hallo zusammen,
mein Problem hat nur indirekt was mit OpenGL zu tun, aber ich hoffe ich finde hier trotzdem Rat.

Also, kurz vorweg:
Ich habe eine Klasse Polygon und eine Klasse Ebene.
In meinem Polygon werden Daten wie, bspw. die Eckpunkte gespeichert und es verfügt über Funktionen zum Zeichnen seiner selbst.
Meine Ebene besteht wiederum aus einer Liste von Polygonen, Attributen wie: Farbe und Höhe und einigen Funktionen.
Jedes Polygon wird einer Ebene zugeordnet und erhält einen Zeiger auf seine Ebene, dies geschieht mit einem AddPoly Befehl der Ebene.
Die Daten der Polygone und Ebenen lese ich aus einer Datei aus.

Code:
  1. type
  2. PEbene = ^TEbene;
  3.  
  4. TPolygon = class
  5.   private
  6.     Parent : PEbene;
  7.   public
  8.     constructor Create; overload;
  9.     constructor Create(MyParent : PEbene); overload;
  10.     procedure Berechnen;
  11.   end;
  12.  
  13. TEbene = class
  14.   private
  15.     mName : String;
  16.   public
  17.     procedure AddPoly(MyPoly : TPolygon);
  18.   end;
  19.  
  20. implementation
  21.  
  22. constructor TPolygon.Create(MyParent : PEbene);
  23. begin
  24.   ...
  25.   Parent := PEbene;
  26.   ...
  27. end;
  28.  
  29. procedure Berechnen;
  30. var s : String;
  31. begin
  32.   // irgendwas tuen, bspw Namen auslesen
  33.   S := Parent^.mName;  <- Hier tritt der Fehler auf
  34. end;
  35.  
  36. procedure TEbene.AddPoly(MyPoly : TPolygon);
  37. begin
  38.   MyPoly := @Self; <- hier wird der Fehler meiner Meinung nach erzeugt
  39. end;
  40.  


Nun, mein Problem ist nun, dass... wer hätte es anders erwartet es nicht funktioniert^^.
Aufgerufen wird das ganze ungefähr so:
Code:
  1. procedure BeispielAufrufEins;
  2. var Tmp : PEbene;
  3. begin
  4.   Tmp := @EineEbene;
  5.   NeuesPoly := TPolygon.Create(Tmp);
  6.   NeuesPoly.Berechne; <- Funktioniert
  7.   EineEbene.AddPoly(NeuesPoly);
  8. end;
  9.  
  10. procedure BeispielAufrufZwei;
  11. begin
  12.   EbeneVonOben[IndexVonObigenPoly].Berechne; <- Funktioniert nicht mehr!
  13. end;
  14.  


Nun es sieht wie folgt aus, ich rufe die beiden Prozeduren auf, in der ersten (hier wird das Einlesen realisiert) läuft alles noch wie es soll: die einzelnen Polygone greifen auf ihre Parents zurück und alle Funktionen sind glücklich. Springt er jedoch nach dem Einlesen in die nächste Prozedur, quittiert mir Delphi alles mit einem Zugriffsfehler.

Ich habe das ganze mal versucht mit dem Debugger nachzuvollziehen... dabei fiel mir auf, dass meine Ebenen die Werte/Speicherplätze §ADXXXX haben. Der Wert Tmp aus AufrufEins liefert auch einen solchen Zeigerwert zurück. Auch das Polygon hat dann den Parent $AXXXXXX womit die Berechnungen hier auch funktionieren. Wenn ich aber jetzt das Polygon meiner Ebene hinzufügen will, ist mir aufgefallen dass der Wert Self mir eine völlig andere Adresse meiner Ebene liefert was in etwas so ausschaut: $F5DXXXX. Folglich verweist der Parent des Polygons jetzt auf... ja was eigentlich(?) .. und somit schlägt der zweite BeispielAufruf mit einer Zugriffsverletzung fehl.

Nun steh ich vor der Frage, wie bekomme ich es hin, dass mein Parent auf die richtige Ebene zeigt. Eigentlich sollte Self doch das Objektes wiedergeben und @Self dann einen Zeiger darauf, oder irre ich hier? Ich muss beim Übergeben an die Ebene, den Parent des Polygons ändern, da es auch Polygone gibt, welche ohne Parent das Licht der Welt erblicken können.

Nun ich hoffe ich hab halbwegs verständlich mein Problem rübergebracht.. und vielleicht kennt ja jemand die Lösung :/

Grüße


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Klassen und Zeiger
BeitragVerfasst: Mo Dez 14, 2009 18:07 
Offline
Ernährungsberater
Benutzeravatar

Registriert: Sa Jan 01, 2005 17:11
Beiträge: 2068
Programmiersprache: C++
Klassen sind Pointer, von daher sind Pointer auf Klassen unsinnig.

_________________
Steppity,steppity,step,step,step! :twisted:
❆ ❄ ❄ ❄ ❅ ❄ ❆ ❄ ❅ ❄ ❅ ❄ ❅ ❄ ❄
❄ ❄ ❄ ❅ ❄ ❄ ❄ ❅ ❄ ❄ ❆ ❄ ❄


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Klassen und Zeiger
BeitragVerfasst: Mo Dez 14, 2009 18:24 
Offline
DGL Member

Registriert: Mi Okt 21, 2009 14:02
Beiträge: 22
Hmmm, entweder habe ich dann hier gerade eine Denkblockade... aber, um in meinem Polygon auf die Attribute der Ebene (Parent) zugreifen zu können, muss ich doch auf diese "Zeigen". Da mir Delphi nicht erlaubt bereits in der Dekleration folgendes zu schreiben:
Code:
  1. TPolygon = class
  2. private
  3.   Parent : TEbene
  4. end;
  5.  
  6. TTEbene = class
  7. private
  8.   ...
  9. public
  10. ...

muss ich doch den Weg über
Code:
  1. PEbene = ^TEbene

gehen?

Grüße


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Klassen und Zeiger
BeitragVerfasst: Mo Dez 14, 2009 18:46 
Offline
Ernährungsberater
Benutzeravatar

Registriert: Sa Jan 01, 2005 17:11
Beiträge: 2068
Programmiersprache: C++
TEbene ist schon PEbene.

_________________
Steppity,steppity,step,step,step! :twisted:
❆ ❄ ❄ ❄ ❅ ❄ ❆ ❄ ❅ ❄ ❅ ❄ ❅ ❄ ❄
❄ ❄ ❄ ❅ ❄ ❄ ❄ ❅ ❄ ❄ ❆ ❄ ❄


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Klassen und Zeiger
BeitragVerfasst: Mo Dez 14, 2009 18:47 
Offline
DGL Member

Registriert: Fr Okt 03, 2008 13:32
Beiträge: 367
Das geht und zwar so:
Code:
  1. TEbene = class;
  2. TPolygon = class
  3. private
  4.   Parent : TEbene;
  5. end;
  6.  
  7. TEbene = class
  8. private
  9.   ...
  10. public
  11.   ...


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Klassen und Zeiger
BeitragVerfasst: Mo Dez 14, 2009 19:00 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Exakt. Was Schläfer beschreibt ist eine Forward-Declaration. Damit kannst du Delphi schon im Voraus sagen, dass TEbene später als Klasse deklariert wird. Der Umweg über den Pointer ist nicht schön und sollte bei Objekten/Klassen nur in besonderen Situationen verwandt werden.

greetings

_________________
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: Re: Klassen und Zeiger
BeitragVerfasst: Mo Dez 14, 2009 19:10 
Offline
DGL Member

Registriert: Mi Okt 21, 2009 14:02
Beiträge: 22
Ok, wieder was gelernt :)
Damit hat sich mein Problem scheinbar gelöst, morgen gleich mal ausprobieren.
Ich danke euch vielmals!

Grüße


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 7 Beiträge ] 
Foren-Übersicht » Programmierung » Allgemein


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 10 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.009s | 15 Queries | GZIP : On ]