🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: de.comp.lang.c++
Article #351

Re: Q: Adresse einer Methode

#351
From: Reinhard Pfau
Date: Fri, 01 Sep 1995 07:46
50 lines
2566 bytes
Christian Horn (chorn@cip48.cscip.uni-sb.de) wrote:
: Reinhard Pfau (gz342@appl2.hrz.uni-siegen.de) wrote:
: : void A::f1 (void) {
: :   struct ptrCombi {
: :     void far* fkt;
: :     void far* ci;
: :   } mp;
: :   unsigned seg,ofs;
: : 
: :   *( (void (A::**)(void)) (&mp) ) = &A::f2;
: :   seg = FP_SEG(mp.fkt);
: :   ofs = FP_OFS(mp.fkt);
: :   // ---  mach was mit seg, ofs  ---
: : }

: Vielen Dank, das hat funktioniert (benutze Borland C++ 3.1).
: Koenntest Du den Code vielleicht kommentieren?

Naja, so viel zu kommentieren gibt's da eigentlich nicht.
Bei Borland/Turbo-C++ besteht ein Zeiger auf eine Memberfkt aus 2 Zeigern:

: Was bedeutet die Variable 'ci' in der Struktur?
Einen Zeiger auf die Adresse der Memberfkt und einem zweiten Zeiger,
ueber den ich nur eine Vermutung habe. (ci soll fuer "CurrentInstance"
stehen). Bei der Adresszuweisung wird der 2.Zeiger auf NULL gesetzt.

[SPEKULATION ON]
Ich nehme an, dass er bei 'normaler' Verwendung einer Funktionsvariable
beim Aufruf der Funktion den zugehoerigen this-Zeiger aufnimmt.
[SPEKULATION OFF]
Auf obige Struktur kam ich durch TAE (Try-And-Error); offiziell dokumentiert 
habe ich das noch nirgendwo gesehen.

Tja, und die Adresszuweisung ist einer der ueblichen Type-Casts, mit dem
man einem Compiler dazu bringt, einer Struktur einen dazu eigentlich
inkompatiblen Wert zuzuweisen (man castet einen Zeiger auf die Struktur
auf einen Zeiger der zuzuweisenden Struktur und dereferenziert das ganze).
WARNUNG: bei sowas sollte man genau wissen, was man macht; die Fehler-
moeglichkeiten sind sehr hoch, da man dabei die Typpruefung des Compilers
umgeht.

: Nochmals vielen Dank,
: Christian
 Gern geschehen. :)   Reinhard.
--
 /-- Reinhard Pfau --- (ED-Pfau) --------------------------------------------\
| eMail: gz342@appl2.hrz.uni-siegen.de  |  IRC: Mubo  | no home-page         |
+----------------------------------------------------------------------------+
  "Programming is: Force the computer to do what _YOU_ want."  (rp)
  "Using M$-ware is the opposite!" 
Technical Details
Message-ID: <426dpa$5mj@si-nic.hrz.uni-siegen.de>
Path: arc1-ca.pugleaf.net!appl2.hrz.uni-siegen.de!gz342
References: <41ibde$pnu@hades.rz.uni-sb.de> <41ue99$4ip@si-nic.hrz.uni-siegen.de> <423hdj$2a4@hades.rz.uni-sb.de>

Show Full Headers
Complete Article Headers
Path: arc1-ca.pugleaf.net!appl2.hrz.uni-siegen.de!gz342
From: gz342@appl2.hrz.uni-siegen.de (Reinhard Pfau)
Newsgroups: de.comp.lang.c++
Subject: Re: Q: Adresse einer Methode
Date: 1 Sep 1995 07:46:50 GMT
Organization: HRZ, UNI/GHS Siegen
Message-ID: <426dpa$5mj@si-nic.hrz.uni-siegen.de>
References: <41ibde$pnu@hades.rz.uni-sb.de> <41ue99$4ip@si-nic.hrz.uni-siegen.de> <423hdj$2a4@hades.rz.uni-sb.de>
NNTP-Posting-Host: appl2.hrz.uni-siegen.de
X-Newsreader: TIN [version 1.2 PL2]