0

我正在尝试制作一个简单的 BST ADT,但我遇到了一些问题,因为我还是 C 的新手。

它可以编译,但是带有警告和“注释”,如果我运行程序,它只会打印一个元素,即根节点(我希望它按顺序打印所有元素)。

我只提供了我认为必要的代码片段,如果你想要所有的代码就问吧。

bst.c - BST 遍历方法

41    void bst_inorder(bst b, void f(char *str)) {
42       if (b->key == NULL) {
43          return;
44       }
45       bst_inorder(b->left, f);
46       f(b->key);
47       bst_inorder(b->right, f);
48    }

测试.c

14    bst_inorder(my_bst, printf);

bst.h

10    extern void bst_inorder(bst b, void f(char *str));

我正在像这样编译它

gcc -O2 -W -Wall -ansi -pedantic *.c -o TEST

我收到这些警告

TEST.c: In function ‘main’:
TEST.c:14:4: warning: passing argument 2 of ‘bst_inorder’ from incompatible pointer type [enabled by default]

In file included from TEST.c:3:0:
bst.h:10:13: note: expected ‘void (*)(char *)’ but argument is of type ‘int (*)(const char * __ restrict__)’
4

3 回答 3

2

printf()警告仅仅是因为您的参数和函数之间确实存在不匹配。

您的函数需要void (*)(char *),但printf()签名是int (*)(const char *, ...). 显然,这些并不相同。

可能没问题,但最简单的修复方法是编写一个“shim”或“trampoline”函数:

static void print_node(char *str)
{
  printf("%s", str);
}

然后使用它而不是printf直接在对bst_inorder().

不确定另一个问题,我认为没有足够的代码来帮助解决这个问题。

于 2013-08-28T07:15:42.870 回答
2

它说什么 - 你的函数期待一个返回 void 的函数,而printf返回 int。

另一个问题是函数指针的正确语法是这样的:

void (*f)(char *str)

或者在以下情况下printf

int (*f)(const char *)
于 2013-08-28T07:17:49.617 回答
0

警告很清楚,bst_inorder类型不匹配的第二个参数。

我假设您尝试printf仅用于打印字符串(即,不使用变量参数部分),在这种情况下,您可以像这样包装它:

void my_printf(char *str)
{
    printf("%s", str);
}

并调用它:

bst_inorder(my_bst, my_printf);
于 2013-08-28T07:16:56.170 回答