0

私は単純な BST ADT を作成しようとしていますが、まだ C に慣れていないため、いくつかの問題があります。

コンパイルされますが、警告と「メモ」が表示されます。プログラムを実行すると、ルートノードの1つの要素のみが出力されます(すべての要素を順番に出力したい)。

すべてのコードが必要な場合は、私が必要だと思ったコード スニペットのみを提供しました。

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    }

TEST.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 *, ...)です。明らかに、これらは同じではありません。

おそらく問題ありませんが、これを修正する最もクリーンな方法は、「シム」または「トランポリン」関数を作成することです。

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

次にprintf、への呼び出しで直接ではなく、それを使用しbst_inorder()ます。

他の問題についてはわかりませんが、それを支援するのに十分なコードが存在しないと思います。

于 2013-08-28T07:15:42.870 に答える
2

printfそれが言うこと-あなたの関数はintを返す一方で、voidを返す関数を期待しています。

他の問題は、関数へのポインターの正しい構文が次のようなものであることです。

void (*f)(char *str)

またはの場合printf

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

警告は明確で、bst_inorder型の不一致の 2 番目の引数です。

文字列のみを出力する (つまり、可変引数部分を使用しない)ために使用しようとしていると仮定しますprintf。その場合、次のようにラップできます。

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

そしてそれを呼び出す:

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