 |
C++Talk.NET C++ language newsgroups
|
| View previous topic :: View next topic |
| Author |
Message |
Ralf Bartzke Guest
|
Posted: Sun Jul 02, 2006 6:51 pm Post subject: Zeiger auf Funktion(Zeiger auf Funktion) |
|
|
Hallo Leuts,
ich überlege seit einiger Zeit, wie ich einen neuen Typ "Zeiger auf
Funktion" definiere, wenn die Funktion einen Zeiger dieses Typs als
Parameter benötigt.
Das folgende akzeptiert mein Compiler nicht:
typedef int (*FunctionPointerTyp)(FunctionPointerTyp FunctionPointer);
-> "'FunctionPointerTyp' : nichtdeklarierter Bezeichner"
Ist die Fehlermeldung des Compilers korrekt bzw. wie definiert man einen
solchen Zeiger in C++?
Ralf
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de |
|
| Back to top |
|
 |
Daniel Albuschat Guest
|
Posted: Mon Jul 03, 2006 9:11 am Post subject: Re: Zeiger auf Funktion(Zeiger auf Funktion) |
|
|
Ralf Bartzke wrote:
| Quote: | Hallo Leuts,
ich überlege seit einiger Zeit, wie ich einen neuen Typ "Zeiger auf
Funktion" definiere, wenn die Funktion einen Zeiger dieses Typs als
Parameter benötigt.
Das folgende akzeptiert mein Compiler nicht:
typedef int (*FunctionPointerTyp)(FunctionPointerTyp FunctionPointer);
-> "'FunctionPointerTyp' : nichtdeklarierter Bezeichner"
|
FunctionPointerTyp ist an der Stelle ja auch nicht deklariert.
Kann ja auch nicht deklariert sein, ohne, dass er weiss, was
FunctionPointerTyp ist.
| Quote: | Ist die Fehlermeldung des Compilers korrekt bzw. wie definiert man einen
solchen Zeiger in C++?
|
Die Fehlermeldung ist korrekt. Wie man es trotzdem bewerkstellig: Ich
glaube, das ist unmoeglich. Nach einiger Ueberlegung und Ansatzversuchen
mit Templates bin ich zumindest zu keiner Loesung gekommen. IMHO
benoetigt die Sprache hier ueberarbeitung.
MfG,
Daniel
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de |
|
| Back to top |
|
 |
Hubert Schmid Guest
|
Posted: Tue Jul 04, 2006 2:18 am Post subject: Re: Zeiger auf Funktion(Zeiger auf Funktion) |
|
|
Ralf Bartzke <Ralf.Bartzke@t-online.de> writes:
| Quote: | ich überlege seit einiger Zeit, wie ich einen neuen Typ "Zeiger auf
Funktion" definiere, wenn die Funktion einen Zeiger dieses Typs als
Parameter benötigt.
|
Das hört sich für mich nach einer theoretischen Frage an. Oder hast du
ein konkretes Problem, das du damit lösen willst?
Ich vermute, dass das in C++ so nicht geht. Du brauchst einen Typ für
den gilt: 'T = void (*)(T)'. Da man in C++ vermutlich eine Ordnung
(transitiv, irreflexiv) auf den Typen definieren kann, so dass für
alle Typen T 'T < void (*)(T)' gilt, hast du einen Widerspruch.
In dynamisch typisierten Sprachen geht das hingegen in der Regel,
beispielsweise in python: 'def f(g): g(g)'
Auch im statisch typisierten Lambda-Kalkül kannst du sowas einfach
machen: '((@ x . (x x)) (@ x . (x x)))'
In C++ kannst so etwas das durch eine Klasse-Hierarchie simulieren:
struct F
{
virtual void eval(F* f)
{
f->eval(f);
}
};
int main()
{
F* f = XXX;
f->eval(f);
}
Gruß, Hubert
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de |
|
| Back to top |
|
 |
Ralf Bartzke Guest
|
Posted: Tue Jul 04, 2006 11:33 pm Post subject: Re: Zeiger auf Funktion(Zeiger auf Funktion) |
|
|
Hubert Schmid schrieb:
| Quote: | Ralf Bartzke <Ralf.Bartzke@t-online.de> writes:
ich überlege seit einiger Zeit, wie ich einen neuen Typ "Zeiger auf
Funktion" definiere, wenn die Funktion einen Zeiger dieses Typs als
Parameter benötigt.
Das hört sich für mich nach einer theoretischen Frage an. Oder hast du
ein konkretes Problem, das du damit lösen willst?
Ja. Ich möchte mit der (wohl nicht zu iso-c++ gehörenden, aber weit |
verbreiteten) _alloca()-Funktion) schnell Speicherplätze für
verschiedene Datentypen auf dem Stack allozieren.
_alloca() wird innerhalb von Template-Funktionen aufgerufen, die sich
mit den Besonderheiten der jeweiligen Datentypen auskennen.
Da der von _alloca() bereitgestellte Speicherplatz automatisch gelöscht
wird, sobald die _alloca() aufrufende Funktion endet, rufen sich die
Template-Funktionen in einer Verkettung gegenseitig auf, die durch ein
Feld von Funktionspointern definiert wird.
Das Ende der Verkettung bildet ein Pointer auf jene Funktion, die die
innerhalb der Verkettung allozierten Speicherplätze nutzt.
Der hierzu passende Zeigertyp währe ein Zeiger auf eine Funktion, die
als Parameter einen Zeiger des gleichen Typs auf die als nächstes
aufzurufende Funktion erhält.
| Quote: | Ich vermute, dass das in C++ so nicht geht.
|
Habe ich auch vermutet. Mist. Werde wohl mit void-Pointern herumcasten
müssen.
| Quote: | In C++ kannst so etwas das durch eine Klasse-Hierarchie simulieren:
struct F
{
virtual void eval(F* f)
{
f->eval(f);
}
};
int main()
{
F* f = XXX;
f->eval(f);
}
Gruß, Hubert
Das könnte eine Lösung sein. Muss noch darüber nachdenken. |
Ralf
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de |
|
| Back to top |
|
 |
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
|