2013-08-28 2 views
0

Я пытаюсь сделать простой BST ADT, и у меня возникают некоторые проблемы, так как я еще новичок в C.Passing Е() в качестве параметра

собирает, но с предупреждениями и а ' note ', если я запустил программу, он печатает только один элемент, корневой узел (я хочу, чтобы он печатал все элементы inorder).

Я только предоставил фрагменты кода, которые, как я думал, были необходимы, если вы хотите, чтобы весь код просто спросил.

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__)’ 
+2

Вы могли бы хотеть проверить фактическое прототип [ ' printf'] (http://en.cppreference.com/w/c/io/fprintf).Что вы, конечно, тоже имеете в сообщении об ошибке. –

ответ

2

Предупреждение просто потому, что на самом деле это неправильно матч между аргументом и функцией printf().

Ваша функция: void (*)(char *), но подпись printf() - int (*)(const char *, ...). Ясно, что это не одно и то же.

Это, вероятно, хорошо, но чистый способ, чтобы исправить это, чтобы написать или функцию «прокладку», «трамплин»:

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

Затем использовать что вместо printf непосредственно в вызове bst_inorder().

Не уверен относительно другой проблемы, я думаю, что кода недостаточно, чтобы помочь в этом.

0

Предупреждение ясно, второй аргумент bst_inorder несоответствие типа.

Я предполагаю, что вы пытаетесь использовать printf для печати строк только (то есть, не используя переменную аргумент часть), в этом случае, вы можете обернуть его так:

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

И называть его :

bst_inorder(my_bst, my_printf); 
+0

Передача строки сообщения 'printf' вместо строки формата является классической ошибкой, которая обычно приводит к нарушению безопасности. –

+0

@R .. Спасибо, я не понял потенциальную проблему, использование '% s', безусловно, лучший выбор. –

2

Что он говорит - ваша функция ожидает функции возвращения пустоты, в то время как printf возвращает Int.

Другая проблема заключается в том, что правильный синтаксис для указателя на функцию, как это:

void (*f)(char *str) 

Или в случае printf:

int (*f)(const char *) 
Смежные вопросы