john@genrad.UUCP (John Nelson) (12/13/83)
I believe that the easiest way to get around the problem is to use a typedef: typedef int (*FUNCTION)(); then you can declare the function returning a pointer to function as: FUNCTION getroutine(name, table) This SHOULD work with all K&R C compilers
garys@bunkerb.UUCP (Gary Samuelson) (12/14/83)
In reply to Steve Summit, who wanted a function returning a
pointer to a function returning an integer:
I tried to write this reply in the same style as your request,
but I guess I don't speak King James English well enough. Will
Today's English suffice :-) ?
Using a typedef divides the declaration into bite-sized pieces,
which the compiler can swallow.
The following program, which I have compiled and run on our VAX
(4.1BSD), contains such a function. Simply tear along the dotted
line.
Gary Samuelson
decvax!ittvax!bunker!bunkerb!garys
-------------------------------------------------
/*
* a couple of functions which return integers
*/
int g( x )
int x;
{
return( x + x );
}
int h( x )
int x;
{
return( x * x );
}
/*
* A function which returns a pointer to a function
* which returns an integer.
*/
typedef int (*ifp)() ;
ifp f( a )
int a;
{
if( a == 0 )
return( g );
else
return( h );
}
main()
{
printf( "%d\n", ((*f)( 0 )) ( 4 ) );
printf( "%d\n", ((*f)( 1 )) ( 4 ) );
}kissell@flairvax.UUCP (Kevin Kissell) (12/15/83)
To declare a function returning a pointer to a function returning an
integer, the construct
int (*funcfunc())()
is pretty standard. Things get confusing when the parameters are added.
Steve's example of the form
int (*getroutine())(name, table)
does indeed fail under 4.1, but
int (*getroutine(name, table))()
will work just fine, and is more correct if you think about it.
What I can't figure is how the first version worked under 2.8!
Kevin D. Kissell
Fairchild Research Center
Advanced Processor Development
uucp:{ucbvax!sun decvax allegra}!decwrl!flairvax!kissellgeorge@mnetor.UUCP (George Hart) (07/18/85)
I'm sorry I've lost the original reference but someone asked
how to declare a function returning a pointer to a function
(returning whatever).
Here's some trivial code that illustrates one way. Using typedef's is better
way especially if you are going to use multiple levels of indirection
(maybe not a good idea to begin with).
extern int printf();
main()
{
int (*func())();
(func())("This is the %dst string.\n",1);
}
int (*func())()
{
return(printf);
}
--
Regards,
George Hart, Computer X Canada Ltd.
UUCP: {allegra|decvax|linus|ihnp4}!utzoo!mnetor!george
BELL: (416)475-8980