PDA

View Full Version : Wrong function prototype in gluTessCallback



Felipe R.
07-06-2009, 08:10 AM
Hi guys, I am trying to compile the red book's
example of tessellation but I keep getting errors like with this code



gluTessCallback(tobj, GLU_TESS_BEGIN, glBegin);




error: invalid conversion from ‘void (*)(GLenum)’ to ‘void (*)()’


Doesn't glBegin have the exact function prototype that gluTessCallback is supposed to accept when we use GLU_TESS_BEGIN ?

Makinis
07-06-2009, 08:39 AM
Doesn't glBegin have the exact function prototype that gluTessCallback is supposed to accept when we use GLU_TESS_BEGIN ?

I don't think so... I think you have to define those fuctions...


void CALLBACK beginCallback(GLenum which)
{
glBegin(which);
}


gluTessCallback(tobj, GLU_TESS_BEGIN, (void(__stdcall*)())beginCallback);

I think this way it will work...

Felipe R.
07-06-2009, 08:50 AM
It did! (sort of...)

I'm using linux so I had to define CALLBACK and change
(void(__stdcall*)()) to (void(CALLBACK*)()) it occurred to me because I saw somewhere that windows define CALLBACK as __stdcall but to be honest with you I'm not certain why I have to cast the function argument, (that is a casting right?).

Edit:
In fact it seems that the casting is the problem because this code compiles:



gluTessCallback(tobj, GLU_TESS_BEGIN, (void(*)())glBegin);


I didn't say I was using a g++ because I thought any C code compiled under a C++ compiler but I just checked and if I use gcc it works without casting.

Makinis
07-06-2009, 09:20 AM
I thought that you had to define the callback function because of the parameter... But it seems you don't have to xD

Well, glad I could "help" (sort of) :p

And yes, that's casting ^^

Felipe R.
07-06-2009, 09:38 AM
You REALY helped. thanks.
but do you know why the casting is necessary in C++ and not in C?
I hate when something works but I don't know why it works.

Makinis
07-06-2009, 10:36 AM
I'm not sure but when I had the same problem as you were having I remember that I read somewhere that these callbacks had to be "casted" only in C++ because of some compatibility problem that C++ has with these callbacks...

But I'm not sure if what I'm saying is correct...

Anyway, if you google it and search for a while, maybe you'll be able to find the answer... If I had time to do that, I would, but I don't have xD

So, if you search and find something, please let me know ;)