![](/i/fill.gif) |
![](/i/fill.gif) |
|
![](/i/fill.gif) |
|
![](/i/fill.gif) |
| ![](/i/fill.gif) |
| ![](/i/fill.gif) |
|
![](/i/fill.gif) |
|
![](/i/fill.gif) |
| ![](/i/fill.gif) |
| ![](/i/fill.gif) |
|
![](/i/fill.gif) |
>> cont is a pointer to a function that is expected to return a pointer
>> to a function. The code here causes a series of functions to be
>> called, each one specifying another function to be called afterwards
>> by returning the address of the function to be called.
>>
>
> I was thinking the same, but I can't seem to find the right type
> definition to make it work without casting to and from void*... Which is
> apparently illegal
This is example code, so it might not be literally runnable... (It might
be simplified somewhat.)
> I'm not too comfortable with function pointers though, so it's likely
> that I'm missing something here... Any hints?
Don't look at me! ;-)
--
http://blog.orphi.me.uk/
http://www.zazzle.com/MathematicalOrchid*
Post a reply to this message
|
![](/i/fill.gif) |
| ![](/i/fill.gif) |
| ![](/i/fill.gif) |
|
![](/i/fill.gif) |
|
![](/i/fill.gif) |
| ![](/i/fill.gif) |
| ![](/i/fill.gif) |
|
![](/i/fill.gif) |
Invisible a écrit :
>>> cont is a pointer to a function that is expected to return a pointer
>>> to a function. The code here causes a series of functions to be
>>> called, each one specifying another function to be called afterwards
>>> by returning the address of the function to be called.
>>>
>>
>> I was thinking the same, but I can't seem to find the right type
>> definition to make it work without casting to and from void*... Which
>> is apparently illegal
>
> This is example code, so it might not be literally runnable... (It might
> be simplified somewhat.)
>
Does it still provide the declaration of cont, by any chance?
--
Vincent
Post a reply to this message
|
![](/i/fill.gif) |
| ![](/i/fill.gif) |
| ![](/i/fill.gif) |
|
![](/i/fill.gif) |
|
![](/i/fill.gif) |
| ![](/i/fill.gif) |
| ![](/i/fill.gif) |
|
![](/i/fill.gif) |
On Thu, 24 Jul 2008 14:24:51 +0200, Vincent Le Chevalier
<gal### [at] libertyallsurfsp amfr> wrote:
> I was thinking the same, but I can't seem to find the right type
> definition to make it work without casting to and from void*... Which is
> apparently illegal
> (http://www.parashift.com/c++-faq-lite/pointers-to-members.html#faq-33.8)
It is illegal because a 'void *' is a data pointer, not a function pointer.
On a related note, we do not know if the original code was supposed to be
standards-compliant or not, nor if it was supposed to be C or C++.
> Here's what I ended up with:
[...snipped...]
The "right" way to do it, assuming C++:
http://www.gotw.ca/gotw/057.htm
--
FE
Post a reply to this message
|
![](/i/fill.gif) |
| ![](/i/fill.gif) |
| ![](/i/fill.gif) |
|
![](/i/fill.gif) |
|
![](/i/fill.gif) |
| ![](/i/fill.gif) |
| ![](/i/fill.gif) |
|
![](/i/fill.gif) |
Fredrik Eriksson wrote:
> On a related note, we do not know if the original code was supposed to
> be standards-compliant or not, nor if it was supposed to be C or C++.
Ment to be ANSI C (not C++).
--
http://blog.orphi.me.uk/
http://www.zazzle.com/MathematicalOrchid*
Post a reply to this message
|
![](/i/fill.gif) |
| ![](/i/fill.gif) |
| ![](/i/fill.gif) |
|
![](/i/fill.gif) |
|
![](/i/fill.gif) |
| ![](/i/fill.gif) |
| ![](/i/fill.gif) |
|
![](/i/fill.gif) |
Invisible wrote:
> So cont points to a zero-argument function that returns a zero-argument
> function? And this loop just calls it repeatedly?
Assuming TRUE is a value that always returns non-zero, yes. The code itself
appears to implement a state machine.
Of course, this being C, 'TRUE' could be a macro that expands to a function
that returns a value and thus the loop need not be infinite. It could even
expand to a variable with a decrement or increment operator. Or really
anything - if the code were presented to someone as part of an computer
science exam, for example, they would probably be expected to pick that
possibility up. In the real world, no programmer would ever do something
that mean with a macro called TRUE. Right? :-)
-- Chris
Post a reply to this message
|
![](/i/fill.gif) |
| ![](/i/fill.gif) |
| ![](/i/fill.gif) |
|
![](/i/fill.gif) |
|
![](/i/fill.gif) |
| ![](/i/fill.gif) |
| ![](/i/fill.gif) |
|
![](/i/fill.gif) |
>> So cont points to a zero-argument function that returns a zero-argument
>> function? And this loop just calls it repeatedly?
>
> Assuming TRUE is a value that always returns non-zero, yes. The code itself
> appears to implement a state machine.
More exactly: It's a workaround for C's lack of lack of GOTO.
[This fragment appears in the output of a compiler that's using C as
"portable assembly".]
> In the real world, no programmer would ever do something
> that mean with a macro called TRUE. Right? :-)
Hey, I found this cool site, it's called The Daily WTF... ;-)
--
http://blog.orphi.me.uk/
http://www.zazzle.com/MathematicalOrchid*
Post a reply to this message
|
![](/i/fill.gif) |
| ![](/i/fill.gif) |
| ![](/i/fill.gif) |
|
![](/i/fill.gif) |
|
![](/i/fill.gif) |
| ![](/i/fill.gif) |
| ![](/i/fill.gif) |
|
![](/i/fill.gif) |
Fredrik Eriksson a écrit :
> On Thu, 24 Jul 2008 14:24:51 +0200, Vincent Le Chevalier
> <gal### [at] libertyallsurfsp amfr> wrote:
>> Here's what I ended up with:
> [...snipped...]
>
> The "right" way to do it, assuming C++:
> http://www.gotw.ca/gotw/057.htm
>
Thanks for that!
--
Vincent
Post a reply to this message
|
![](/i/fill.gif) |
| ![](/i/fill.gif) |
| ![](/i/fill.gif) |
|
![](/i/fill.gif) |
|
![](/i/fill.gif) |
| ![](/i/fill.gif) |
| ![](/i/fill.gif) |
|
![](/i/fill.gif) |
Invisible <voi### [at] dev null> wrote:
> More exactly: It's a workaround for C's lack of lack of GOTO.
Except that C does have goto.
--
- Warp
Post a reply to this message
|
![](/i/fill.gif) |
| ![](/i/fill.gif) |
| ![](/i/fill.gif) |
|
![](/i/fill.gif) |
|
![](/i/fill.gif) |
| ![](/i/fill.gif) |
| ![](/i/fill.gif) |
|
![](/i/fill.gif) |
Chris Cason <del### [at] deletethistoo povray org> wrote:
> Of course, this being C, 'TRUE' could be a macro that expands to a function
> that returns a value and thus the loop need not be infinite.
Actually there are other ways for the loop to end. For instance, the
function being called could execute an exit() call.
(Another less fancy way would be to return a null pointer from the
function, in which case the program will end with a segmentation fault.)
--
- Warp
Post a reply to this message
|
![](/i/fill.gif) |
| ![](/i/fill.gif) |
| ![](/i/fill.gif) |
|
![](/i/fill.gif) |
|
![](/i/fill.gif) |
| ![](/i/fill.gif) |
| ![](/i/fill.gif) |
|
![](/i/fill.gif) |
>> More exactly: It's a workaround for C's lack of lack of GOTO.
>
> Except that C does have goto.
Ooo, really?
In that case, I have *no clue* why they did it this way...
Oh, wait, maybe I do... Can you use GOTO to jump to a *pointer*? Or only
a literal label?
--
http://blog.orphi.me.uk/
http://www.zazzle.com/MathematicalOrchid*
Post a reply to this message
|
![](/i/fill.gif) |
| ![](/i/fill.gif) |
| ![](/i/fill.gif) |
|
![](/i/fill.gif) |
|
![](/i/fill.gif) |
| ![](/i/fill.gif) |