By using this site, you agree to our updated Privacy Policy and our Terms of Use. Manage your Cookies Settings.
426,165 Members | 1,908 Online
Bytes IT Community
+ Ask a Question
Need help? Post your question and get tips & solutions from a community of 426,165 IT Pros & Developers. It's quick & easy.

function pointer

P: n/a
Hello -
I am using a library that takes a function pointer as an argument. Is the code below not possible?
int library_func(void (*func)(int, short, void *));
I am trying to do this...

class Test {
public:
Test();
void a(int, short, void *);
void loop(void);
};

Test::Test()
{
}

void Test::a(int a, short b, void *c)
{
}

void Server::loop(void)
{
void (*func)(int, short, void *) = a;

library_function(func);
}

int main(void)
{
Test s;
s.loop();

return (0);
}
Jul 19 '05 #1
Share this Question
Share on Google+
9 Replies


P: n/a

"David Hill" <da***@wmol.com> wrote in message news:20030624140611.71b47dfa.da***@wmol.com...
Hello -
I am using a library that takes a function pointer as an argument. Is the code below not possible?

void (*func)(int, short, void *) = a;


It is not possible. Member functions are different than regular functions.
You can't convert between the two. What object is the member function
going to be invoked on if you only have the member address?

If you can't change the interface to the library, you're going to have to wrap the
member function call in an ordinary function. You can squirrel away the pointer
to member and "this" pointer in that extra void* operand I suspect.
Jul 19 '05 #2

P: n/a
"Ron Natalie" <ro*@sensor.com> wrote in message
news:Q4********************@giganews.com...

"David Hill" <da***@wmol.com> wrote in message news:20030624140611.71b47dfa.da***@wmol.com...
Hello -
I am using a library that takes a function pointer as an argument. Is the code below not possible?
void (*func)(int, short, void *) = a;


It is not possible. Member functions are different than regular

functions. You can't convert between the two. What object is the member function
going to be invoked on if you only have the member address?

If you can't change the interface to the library, you're going to have to wrap the member function call in an ordinary function. You can squirrel away the pointer to member and "this" pointer in that extra void* operand I suspect.


What does that mean (You can squirrel away the pointer to member and "this"
pointer in that extra void* operand I suspect)?
(i'm a newb, sorry)
Jul 19 '05 #3

P: n/a

Declare a member function of you're object as static. This will keep it from
getting a "this" pointer, and you'll be able to point a C style function
pointer at it. Pass this to you're library. Additionally (and this is the
squirling away part), most of the time when you're doing this, the call that
tells the library where the function to callback is also includes a void*
that you can pass whatever you want to. This void* gets passed to the
function when it is called. Since you passed a static function, you have no
this pointer, and no way to get at the object. Pass the "this" pointer into
that void*, cast it into the object (using dynamic_cast<> for safety) inside
the callback function, and you can now get at you're object.

Nifty no?

Tony
"Jeremy" <th***********@hotmail.com> wrote in message
news:jH**********************@twister.tampabay.rr. com...
"Ron Natalie" <ro*@sensor.com> wrote in message
news:Q4********************@giganews.com...

"David Hill" <da***@wmol.com> wrote in message news:20030624140611.71b47dfa.da***@wmol.com...
Hello -
I am using a library that takes a function pointer as an argument. Is the code below not possible?
void (*func)(int, short, void *) = a;


It is not possible. Member functions are different than regular

functions.
You can't convert between the two. What object is the member function
going to be invoked on if you only have the member address?

If you can't change the interface to the library, you're going to have

to wrap the
member function call in an ordinary function. You can squirrel away
the pointer
to member and "this" pointer in that extra void* operand I suspect.

What does that mean (You can squirrel away the pointer to member and

"this" pointer in that extra void* operand I suspect)?
(i'm a newb, sorry)

Jul 19 '05 #4

P: n/a
Tony Di Croce wrote:

Declare a member function of you're object as static. This will keep it from
getting a "this" pointer, and you'll be able to point a C style function
pointer at it.


Well, maybe. But not portably. Member functions have C++ linkage, and a
C library expects functions with C linkage. Most compilers don't
distinguish between the two, so you can get away with doing this. But
it's better to use a non-member function and mark it extern "C".

--

Pete Becker
Dinkumware, Ltd. (http://www.dinkumware.com)
Jul 19 '05 #5

P: n/a
>

void Server::loop(void)
{
// void (*func)(int, short, void *) = a;


it shud be:
void (*func)(int, short, void *) = &Test::a;
Jul 19 '05 #6

P: n/a
Chandra Shekhar Kumar wrote in news:3E***************@oracle.com:


void Server::loop(void)
{
// void (*func)(int, short, void *) = a;


it shud be:
void (*func)(int, short, void *) = &Test::a;


Not true, there is no conversion from member-function-pointer
to function-pointer, or from member-pointer to pointer for
that matter.

Rob.
--
http://www.victim-prime.dsl.pipex.com/
Jul 19 '05 #7

P: n/a

"Chandra Shekhar Kumar" <ch***********@oracle.com> wrote in message
news:3E***************@oracle.com...


void Server::loop(void)
{
// void (*func)(int, short, void *) = a;


it shud be:
void (*func)(int, short, void *) = &Test::a;


No, this should not work.
My compiler issues this error message:
"'initializing' : cannot convert from 'void (__thiscall
Test::*)(int,short,void *)' to 'void (__cdecl *)(int,short,void *)'
There is no context in which this conversion is possible."
Jul 19 '05 #8

P: n/a

"Chandra Shekhar Kumar" <ch***********@oracle.com> wrote in message news:3E***************@oracle.com...


void Server::loop(void)
{
// void (*func)(int, short, void *) = a;


it shud be:
void (*func)(int, short, void *) = &Test::a;

It still won't work. You can't assign a pointer to member to pointer to (non-member) function
no matter how you qualify it.
Jul 19 '05 #9

P: n/a

"Jeremy" <th***********@hotmail.com> wrote in message news:jH**********************@twister.tampabay.rr. com...
"Ron Natalie" <ro*@sensor.com> wrote in message
news:Q4********************@giganews.com...

"David Hill" <da***@wmol.com> wrote in message

news:20030624140611.71b47dfa.da***@wmol.com...
Hello -
I am using a library that takes a function pointer as an argument. Is the code below not possible?
void (*func)(int, short, void *) = a;


It is not possible. Member functions are different than regular

functions.
You can't convert between the two. What object is the member function
going to be invoked on if you only have the member address?

If you can't change the interface to the library, you're going to have to

wrap the
member function call in an ordinary function. You can squirrel away the

pointer
to member and "this" pointer in that extra void* operand I suspect.


What does that mean (You can squirrel away the pointer to member and "this"
pointer in that extra void* operand I suspect)?
(i'm a newb, sorry)


struct WrapperHelper {
Test* obj;
void (TEST::*fp)(int, short, void*);
void* arg;
} ;

void Wrapper(int i, short s, void* vp) {
WrapperHelper* sp = static_cast<WrapperHelper*>(vp);
(sp->*func)(i, s, sp->arg);
delete sp;
}

void Test::SetupWrapper() {
WrapperHelper* sp = new WrapperHelper;
sp->obj = this;
sp->fp = &Test::func;
sp->arg = whatever.
library_func(&Wrapper, sp);
}

Jul 19 '05 #10

This discussion thread is closed

Replies have been disabled for this discussion.