Can I passing a funtion pointer to a FUNTION which point to THE FUNTION?

L

Lee Xuzhang

/* from SICP -- Exercise 4.21:
((lambda (n)
((lambda (fact)
(fact fact n))
(lambda (ft k)
(if (= k 1)
1
(* k (ft ft (- k 1)))))))
10)
*/


/* I want to do the same thing like that in C/C++. */

#include <stdio.h>

/* I find that I can't declare the function what I want, in standard
C/C++.
* My colleague try the following code. It's OK, but I find something
wrong.
*/
int f( int (*g)(), int x )
{
if (x==0)
return 1;
else
return x * (*g)(g, x-1);
}


int h(void)
{
return 2;
}


int main()
{
printf("%d\n", f(f,5)); /* This is what I want. */

/* This is not I want; but the complier didn't warning. */
printf("%d\n", f(h,5));

return 0;
}


==========

/* I find a way to achieve it indirectly, but I do not like it. */
#include <stdio.h>

typedef struct scm {
int (*fp)(struct scm, int);
} SCM;

int f(SCM g, int x)
{
if (x==0)
return 1;
else
return x * (g.fp)(g, x-1);
}


int main()
{
SCM F;
F.fp = f;
printf("%d\n", f(F,5)); /* It's ugly.*/

return 0;
}


/* I am sorry for my poor english. I hope you can understand what I
want.
* I just want to try wrinting "continuation" in C/C++.
*
* This is my question:
* Can I do the same thing like this in standard C/C++?
* Can I passing a funtion pointer to a FUNTION which point to THE
FUNTION?
*/
 
H

Haider

Lee said:
/* from SICP -- Exercise 4.21:
((lambda (n)
((lambda (fact)
(fact fact n))
(lambda (ft k)
(if (= k 1)
1
(* k (ft ft (- k 1)))))))
10)
*/


/* I want to do the same thing like that in C/C++. */

#include <stdio.h>

/* I find that I can't declare the function what I want, in standard
C/C++.
* My colleague try the following code. It's OK, but I find something
wrong.
*/
int f( int (*g)(), int x )
{
if (x==0)
return 1;
else
return x * (*g)(g, x-1);
}


int h(void)
{
return 2;
}
/* try the following change */
typedef int(*fp)(void*, int);
int fun( fp x , int y)
{
if(y ==0 )
return 1;
else
return y * (*x)(x, y-1);
}
int main()
{
printf("%d\n", f(f,5)); /* This is what I want. */
printf("%d\n", fun(fun,5)); /*work fine*/
/* This is not I want; but the complier didn't warning. */
printf("%d\n", f(h,5));

printf("%d\n", fun(h,5)); /*compiler will give
warning*/
 
L

lovecreatesbeauty

Lee said:
int f( int (*g)(), int x )

It's ok. The first parameter g is type of the abstract type int (*) ().
Read the prototype of the library function signal through man signal.
H&S5 §9.2 provides two forms of the prototype of signal.
return x * (*g)(g, x-1);

How can two arguments be passed into the function? Function call and
prototype are mismatch.
 
L

Lee Xuzhang

Thank you.

To Haider:
Your code is work fine in C, but it can't work in C++.

And, from FAQ 4.13:
"...void *'s are only guaranteed to hold object (i.e. data) pointers;
it is not portable to convert a function pointer to type void *. (On
some machines, function addresses can be very large, bigger than any
data pointers.) ..."
(Thanks for Richard Heathfield)

Is "typedef int(*fp)(void*, int); " still right?


Maybe I can't quite do it directly.
(http://c-faq.com/decl/recurfuncp.html)
Thanks for all.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,777
Messages
2,569,604
Members
45,234
Latest member
SkyeWeems

Latest Threads

Top