AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Was macht der Typecast Pointer()?

Ein Thema von s.h.a.r.k · begonnen am 31. Dez 2009 · letzter Beitrag vom 2. Jan 2010
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von s.h.a.r.k
s.h.a.r.k

Registriert seit: 26. Mai 2004
3.159 Beiträge
 
#1

Was macht der Typecast Pointer()?

  Alt 31. Dez 2009, 18:25
Hallo,

meine Frage steht schon im Titel. Was macht der Typecast Pointer()? Macht er das gleiche, wie der @-Operator. Ich habe neulich beides getestet und, auf einen Integer angewendet, es kam etwas verschiedenes dabei raus.

mfg
Armin
»Remember, the future maintainer is the person you should be writing code for, not the compiler.« (Nick Hodges)
  Mit Zitat antworten Zitat
Namenloser

Registriert seit: 7. Jun 2006
Ort: Karlsruhe
3.724 Beiträge
 
FreePascal / Lazarus
 
#2

Re: Was macht der Typecast Pointer()?

  Alt 31. Dez 2009, 18:31
Pointer tut so als wäre eine bestimmte Variable ein Pointer, @ ermittelt die Adresse einer Variablen.
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.858 Beiträge
 
Delphi 11 Alexandria
 
#3

Re: Was macht der Typecast Pointer()?

  Alt 31. Dez 2009, 18:32
 adr := @<Variable>; liefert die Adresse der Variable
adr := Pointer(<Variable>); betrachtet den Inhalt als Adresse
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von s.h.a.r.k
s.h.a.r.k

Registriert seit: 26. Mai 2004
3.159 Beiträge
 
#4

Re: Was macht der Typecast Pointer()?

  Alt 31. Dez 2009, 18:34
Es kommt doch aber nix sinnvolles dabei raus, wenn ich das auf einen Integer anwende. Ich bekomme dann doch einen Pointer der halt irgendwo hin zeigt.

Wie sieht das dann bei der Anwendung auf eine Klasse aus?

Warum die Frage überhaupt? Ich habe diese Code hier gefunden:
Delphi-Quellcode:
procedure TForm2.ExecMethod(OnObject: TObject; MethodName: string) ;
var
   Routine: TMethod;
   Exec: TExec;
begin
   Routine.Data := Pointer(OnObject) ; { <- hier die Stelle }
   Routine.Code := OnObject.MethodAddress(MethodName) ;
   if NOT Assigned(Routine.Code) then Exit;
   Exec := TExec(Routine) ;
   Exec;
end;
»Remember, the future maintainer is the person you should be writing code for, not the compiler.« (Nick Hodges)
  Mit Zitat antworten Zitat
Namenloser

Registriert seit: 7. Jun 2006
Ort: Karlsruhe
3.724 Beiträge
 
FreePascal / Lazarus
 
#5

Re: Was macht der Typecast Pointer()?

  Alt 31. Dez 2009, 18:37
Zitat von s.h.a.r.k:
Es kommt doch aber nix sinnvolles dabei raus, wenn ich das auf einen Integer anwende. Ich bekomme dann doch einen Pointer der halt irgendwo hin zeigt.
Kommt halt darauf an, was in dem Integer steht. Du kannst z.B. auch sowas machen:
Delphi-Quellcode:
var
  Pointer1, Pointer2: Pointer;

...

  Pointer2 := Pointer( Integer(Pointer1) + 5 ); // 5 Bytes hinter Pointer 1
Zitat von s.h.a.r.k:
Wie sieht das dann bei der Anwendung auf eine Klasse aus?
Du meinst wohl ein Objekt, keine Klasse. Ein Objekt ist intern selbst auch nichst anderes als ein Pointer - deswegen klappt die Umwandlung hier problemlos. Aus dem gleichen Grund kannst du z.B. auch Objekte in den Data-Eigenschaften vieler List-/TreeView-Komponenten unterbringen.
Und eine Methode (TMethod) ist nun mal als Record so aufgebaut, dass eine Referenz (Pointer) auf das Objekt und die Adresse der Funktion gespeichert wird. Die Referenz wird benötigt, weil jede Methode einen unsichtbaren ersten Parameter self hat - der ist nötig, damit du auf die Felder des jeweiligen aufrufenden Objekts zugreifen kannst.
  Mit Zitat antworten Zitat
Benutzerbild von s.h.a.r.k
s.h.a.r.k

Registriert seit: 26. Mai 2004
3.159 Beiträge
 
#6

Re: Was macht der Typecast Pointer()?

  Alt 31. Dez 2009, 18:53
Jup, ich meinte ein Objekt einer Klasse

Warum bekomme ich eigentlich bei einen @Methoden() keinen Pointer zurück, sondern eine Fehlermeldung, dass Parameter fehlen? oO

Eigentlich müsste das doch klappe, oder? Bzw. wo liegt der Unterschied zwischen Methoden (Prozeduren/Funktionen einer Klasse) und normalen Prozeduren/Funktionen?
»Remember, the future maintainer is the person you should be writing code for, not the compiler.« (Nick Hodges)
  Mit Zitat antworten Zitat
Namenloser

Registriert seit: 7. Jun 2006
Ort: Karlsruhe
3.724 Beiträge
 
FreePascal / Lazarus
 
#7

Re: Was macht der Typecast Pointer()?

  Alt 31. Dez 2009, 18:59
Der Unterschied ist, dass bei Methoden immer die Referenz auf das Objekt mitgeliefert werden muss. TMethod ist deshalb auch ein Record mit zwei Pointern, während eine normale Funktion/Prozedur nur einen Pointer hat. Aus diesem Grund wird der @-Operator wahrscheinlich unterbunden.
  Mit Zitat antworten Zitat
Benutzerbild von s.h.a.r.k
s.h.a.r.k

Registriert seit: 26. Mai 2004
3.159 Beiträge
 
#8

Re: Was macht der Typecast Pointer()?

  Alt 1. Jan 2010, 19:41
Wie kann ich dann einen Pointer auf eine Methode bekommen?
Delphi-Quellcode:
var
  Routine: TMethod;
  Exec: TExec;
begin
  Routine.Data := Pointer(OnObject) ;
  Routine.Code := OnObject.MethodAddress(MethodName) ;
  if NOT Assigned(Routine.Code) then Exit;
  Exec := TExec(Routine) ;
  Exec;
end;
Diesen Code habe ich dazu gefunden gehabt, nur liefert mir die Methode MethodAddress leider immer nil zurück, auch wenn das Objekt schon instanziiert ist und eben eine besagte Methode vorhanden ist.
»Remember, the future maintainer is the person you should be writing code for, not the compiler.« (Nick Hodges)
  Mit Zitat antworten Zitat
Benutzerbild von sx2008
sx2008

Registriert seit: 16. Feb 2008
Ort: Baden-Württemberg
2.332 Beiträge
 
Delphi 2007 Professional
 
#9

Re: Was macht der Typecast Pointer()?

  Alt 1. Jan 2010, 23:51
Zitat von s.h.a.r.k:
... nur liefert mir die Methode MethodAddress leider immer nil zurück, auch wenn das Objekt schon instanziiert ist und eben eine besagte Methode vorhanden ist.
Die Methode muss published sein; nur so kann die Adresse anhand des Namens gefunden werden.
fork me on Github
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.033 Beiträge
 
Delphi 12 Athens
 
#10

Re: Was macht der Typecast Pointer()?

  Alt 2. Jan 2010, 00:19
Zitat von sx2008:
Die Methode muss published sein; nur so kann die Adresse anhand des Namens gefunden werden.
oder mindestens Public, wenn man "erweiterte" RTTI-Daten zur Klasse mit eincompiliert (hab grad kein Delphi hier, aber ich glaub es ging mit dem Compilierschalter $M )
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 05:50 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