【发布时间】:2015-09-02 17:32:14
【问题描述】:
在阅读了计算机程序的结构和解释 (SICP) 之后,我决定找到一种方法来使用 C 来实现其中的一些函数式编程技术。我尝试编写一个程序,它的第一个参数是函数名第二个参数是任何接受一个参数并返回一个参数的函数。使用下面的实现,我期待看到 像这样的输出:
fact(7) = 5040
fib(7) = 13
但是我得到了
fact(7) = 5040
fib(7) = 0
连同警告
$ cc map.c
map.c: In function ‘main’:
map.c:41:17: warning: assignment from incompatible pointer type [enabled by default]
maps[0].f_ptr = &fact;
^
map.c:43:17: warning: assignment from incompatible pointer type [enabled by default]
maps[1].f_ptr = &fib;
^
map.c:47:7: warning: passing argument 1 of ‘maps[i].f_ptr’ makes pointer from integer without a cast [enabled by default]
ans = (int) maps[i].f_ptr((int) num);
^
map.c:47:7: note: expected ‘void *’ but argument is of type ‘int’
map.c:47:13: warning: cast from pointer to integer of different size [-Wpointer-to-int-cast]
ans = (int) maps[i].f_ptr((int) num);
^
map.c:52:7: warning: passing argument 1 of ‘maps[i].f_ptr’ makes pointer from integer without a cast [enabled by default]
ans2 = (int) maps[i].f_ptr((int) num);
^
map.c:52:7: note: expected ‘void *’ but argument is of type ‘int’
map.c:52:14: warning: cast from pointer to integer of different size [-Wpointer-to-int-cast]
ans2 = (int) maps[i].f_ptr((int) num);
在编译期间。查看代码我没有发现问题,但是我已经有一段时间没有使用 C 了。有没有更好的方法来实现这样的构造,为什么 fib(7) 打印的是 0 而不是 13?
这是我的代码:
struct Map
{
char* name;
void* (*f_ptr)(void*);
};
int fact(int a) {
if (a == 0)
return 0;
if (a == 1)
return 1;
return a * fact (a-1);
}
int fib(int a) {
if (a == 0)
return 0;
if (a == 1)
return 1;
return fib(a-1) + fib(a-2);
}
int findFunc (char* str, struct Map map)
{
if (map.name == str)
return 1;
return 0;
}
int main()
{
int i = 0;
int ans = 0;
int ans2 = 0;
int num = 7;
struct Map maps[2];
maps[0].name = "fact";
maps[0].f_ptr = &fact;
maps[1].name = "fib";
maps[1].f_ptr = &fib;
for (i; i < (sizeof(maps)/sizeof(maps[0])); i++) {
if (findFunc("fact", maps[i]))
ans = (int) maps[i].f_ptr((int) num);
}
for (i; i < (sizeof(maps)/sizeof(maps[0])); i++) {
if (findFunc("fib", maps[i]))
ans2 = (int) maps[i].f_ptr((int) num);
}
printf("fact(%d) = %d\n", num, ans);
printf("fib(%d) = %d", num, ans2);
return 0;
}
【问题讨论】:
-
而不是
void* (*f_ptr)(void*);定义int (*f_ptr)(int);。 -
@alk 正如我上面所指出的,我想使用 void* 的原因是我可以允许不同类型的函数。
-
使用
void*(*)(void*)只允许您使用获取一个指针值并返回一个指针值的函数。
标签: c functional-programming sicp