[C++] Functienaam toekennen via functie

Pagina: 1
Acties:

  • AuC
  • Registratie: Januari 2003
  • Laatst online: 10-07 15:00
Hey,

Ik wist niet hoe ik deze titel anders moest noemen, dus doe ik het maar zo. Ik ben momenteel bezig met het boek 'OpenGL Game Programming'. Nu wil ik alvast beginnen aan een kleine simpele engine. Nu is het mijn bedoeling dat de gebruiker via een functie, laat weten welke functie ik moet aanroepen. Iets als:

C++:
1
SetWndProcFunc(WndProc);


Dan wil ik, dat deze functie het adres naar WndProc opslaat. En deze vanuit mijn engine aanroept. Dit wordt o.a gebruikt bij de GLUT Library.

Iemand enig idee hoe ik dit kan aanpakken? Ik weet namelijk helemaal niet hoe ik dit kan oplossen.

Hoop dat het een beetje duidelijk is.

Bvd
AuC

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 01:56
Dat is eigenlijk meer een C vraag dan een C++ vraag. Als je een C++ API ontwerpt, kun je hier gewoon functor objecten (objecten die de ()-operator implementeren) voor gebruiken, maar de C methode werkt natuurlijk ook gewoon in C++ (zelfs uitgebreid tot methoden, als ik me niet vergis).

Uiteraard moet de signature van je functie vast staan; daarna staat niets je in de weg om een function pointer als waarde op te slaan. Het is misschien het duidelijkst te demonstreren met een voorbeeldje:
C:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include <stdio.h>

typedef int(*func_t)(int);

int foo(int x)
{
        return 2*x;
}

func_t my_func;    
void set_func(func_t func)
{
        my_func = func;
}

void use_func()
{
        printf("%i\n", my_func(333));  /* print 666 */
}

int main()
{
        set_func(foo);
        use_func();
        return 0;
}

Er komt dus eigenlijk geen C++ code bij kijken. Ik heb er maar een voorbeeldje van gemaakt omdat de syntax voor de omschrijving van een functie-type vrij moeilijk zelf te verzinnen is.

edit:
Oh ja, uit m'n bookmarks: er is zelfs een website helemaal over function pointers: :o
www.function-pointer.org
Ik kan je de hele website aanraden; het is allemaal goede informatie en relevant voor je probleem. :)

[ Voor 24% gewijzigd door Soultaker op 01-10-2003 15:45 ]


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 13-08 16:46

curry684

left part of the evil twins

Je bedoelt dus dat je een functiepointer wil opslaan om later aan te roepen?

Spuit elf ziet Soultaker's reply en houdt op met voorbeeldcode kloppen ;)

[ Voor 37% gewijzigd door curry684 op 01-10-2003 15:42 ]

Professionele website nodig?


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 21-08 12:02

.oisyn

Moderator Devschuur®

Demotivational Speaker

Soultaker schreef op 01 October 2003 @ 15:41:
Ik heb er maar een voorbeeldje van gemaakt omdat de syntax voor de omschrijving van een functie-type vrij moeilijk zelf te verzinnen is.
Als je nou niet weet hoe je een bepaald type moet specificeren in C++, dan kun je prima gebruik maken van C++'s RTTI om een voorbeeld te genereren :)

Voorbeeld: ik wil een functiepointer, maar heb geen idee wat het type daarvoor moet zijn

Antwoord:
C++:
1
2
3
4
5
6
7
8
9
// functie waarvan ik de pointer wil
void func (int i, double j)
{
}

int main ()
{
    std::cout << typeid (&func).name () << std::endl;
}


En het resultaat:

code:
1
void (__cdecl*)(int,double)


en tadaa, nu weet je de specificatie van het type :)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • Soultaker
  • Registratie: September 2000
  • Laatst online: 01:56
.oisyn schreef op 01 oktober 2003 @ 16:16:
Als je nou niet weet hoe je een bepaald type moet specificeren in C++, dan kun je prima gebruik maken van C++'s RTTI om een voorbeeld te genereren :)
[...]
en tadaa, nu weet je de specificatie van het type :)
DAT is nog eens superhandig! (Maar dan moet je nog steeds weten waar je de identifier moet planten als je er een declaratie mee wilt bouwen.)

Ook nuttig dat je dan de calling convention erbij hebt (want die is niet zo 1-2-3 duidelijk als je een functie declareert zonder een specifieke calling convention aan te geven). Uiteraard gaat het goed mis als je een functie met verkeerde calling convention aanroept...

[ Voor 24% gewijzigd door Soultaker op 01-10-2003 16:21 ]


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 21-08 12:02

.oisyn

Moderator Devschuur®

Demotivational Speaker

Soultaker schreef op 01 October 2003 @ 16:18:
DAT is nog eens superhandig! (Maar dan moet je nog steeds weten waar je de identifier moet planten als je er een declaratie mee wilt bouwen.)
dat is idd nog wel eens lastig ja, hoewel die meestal na de * of de & komt (verzin ik nu ter plekke overigens, maar volgens mij klopt het altijd wel)

Bij returnwaarden van functies is het helemaal irritant. Een functie die een void (*)(int) returnt wordt bijvoorbeeld:

C++:
1
void (*func (/*1*/)) (/*2*/)


bij 1 komen dus de parameters van func zelf, bij 2 komen de parameterypen van de functiepointer die ie returnt (de int dus)
Ook wel leuk, een pointer naar een dergelijke functie is vervolgens:
C++:
1
void (__cdecl*(__cdecl*)(void))(int)


:D

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 17:14
Het is een stuk makkelijker lezen als je die domme _cdecl weglaat. Dat is een implementatie detail van Microsoft. Dat ze in de RTTI naar boven komen is toeval, de RTTI name( ) is in ISO C++ niet het type, alleen een debug hulp. De name hoeft bijvoorbeeld niet eens uniek te zijn.

PS. boost::function

[ Voor 13% gewijzigd door MSalters op 01-10-2003 20:23 ]

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein

Pagina: 1