zeiger auf funktion im bcb5?
-
habe in einer struktur ein element angelegt welches ein zeiger auf eine funktion darstellt. die struktur hab ich in form1 definiert und angelegt.
:struct Typ_2 { unsigned char ucBauteilnummer; void (*pBauteilfunktion) (void); }; struct Typ_2 stBauteil;
im DataModule3 ist die funktion vorhanden auf welche später das strukturelement
"pBauteilfunktion" zeigen soll:void TDataModule3::abc (void)
{
}ich will jetzt im DataModule1 das strukturelemt mit der funktionsadresse der funktion abc initialisieren. hab vorher natürlich die header von form1 & datamodule3 in mein datamodule1 eingebunden.
ich schreibe im datamodule1 also:Form1->stBauteil.pBauteilfunktion=DataModule3->abc;
aber beim kompilieren kommt die fehlermeldung:
"Elementfunktion muss aufgerufen oder ihre Adresse übernommen werden"
aber sowohl das definieren von zeigern auf funktionen noch das zuweisen von dessen adressen ist doch so richtig, oder?
warum geht das dann nicht?und wenn ich beim zuweisen der funktionsadresse stattdessen schreibe:
Form1->stBauteil.pBauteilfunktion=&DataModule3->abc;kommt folgende fehlermeldung:
"Konvertierung von 'void (* (_closure )())()' nach 'void (*)()' nicht möglich"[ Dieser Beitrag wurde am 04.05.2003 um 18:26 Uhr von tenim editiert. ]
-
jetzt gehts. hab bei der strukturdefinition in form1 statt:
void (*pBauteilfunktion) (void);
gschrieben:
void (__closure *pBauteilfunktion) (void);würde nur gerne wissen warum es jetzt geht und was dieses __closure bedeutet.
-
ok, hab die antwort durch nutzen der "suchen"-funktion teilweise gefunden
sorry.
-
Original erstellt von tenim:
würde nur gerne wissen warum es jetzt geht und was dieses __closure bedeutet.Das Problem liegt in der C++-Sprach-Spezifikation: Zeiger auf klasseninterne Funktionen einer Instanz sind eigentlich nicht ohne Brechstange zu erhalten. (abegesehen von static-Funktionen). Borland hat dem entgegengewirkt indem sie das Herstellerabhängige Schlüsselwort __closure (herstellerabhängig ist erkennbar durch die vorangestellten beiden '_') eingeführt, damit auch die VCL so komfortabel bleiben kann, wie sie in ObjectPascal - und dank des Schlüsselworts auch im C++ Builder - ist.
Wieso ist es nun aber nicht möglich einen Zeiger auf eine klasseninterne Funktion zu erhalten? Das Problem ist, dass eine Funktion einer Klasse keine fixe Adresse besitzt, bis eine Instanz einer Klasse erstellt ist. Dazu kommt, dass eine klasseninterne Funktion implizit über einen "this"-zeiger verfügt. Dieser Zeiger jedoch ändert sich von instanz zu instanz. Hast du nun nur die Einsprungsadresse für die Methode, so kann kein "this"-Zeiger zugeordnet werden.
-junix