2017-02-20 6 views
-1

これはアンロード機能コードです。私のCアンロード機能で "未定義のリファレンス"をデバッグするには?

bool unload(void) 
{ 
    void release_nodes (node* node_to_free); 

    //looking for children node to free 
    for (int i = 0; i < 27; i++) 
    { 
     if (node_to_free -> children[i]) 
     { 
      release_nodes (node_to_free -> children[i]); 
     } 
    } 

    free (node_to_free); 

    return false; 
} 

これはコンパイル時に受け取る応答です。

clang -ggdb3 -O0 -Qunused-arguments -std=c11 -Wall -Werror -c -o speller.o speller.c 
clang -ggdb3 -O0 -Qunused-arguments -std=c11 -Wall -Werror -c -o dictionary.o dictionary.c 
clang -ggdb3 -O0 -Qunused-arguments -std=c11 -Wall -Werror -o speller speller.o dictionary.o 
dictionary.o: In function `unload': 
/home/ubuntu/workspace/pset5/speller/dictionary.c:170: undefined reference to `release_nodes' 
clang: error: linker command failed with exit code 1 (use -v to see invocation) 
make: *** [speller] Error 1 
+6

「release_nodes」はどこに定義されていますか?どのソースファイルですか?あなたはそのファイルでビルドしますか? –

+1

また、別の関数の中で関数を宣言することは、おそらくあなたが望むものではありません(間違っているわけではありませんが)。いくつかのヘッダーファイルで宣言を移動する方がよいでしょう。 – ForceBru

+0

これは 'release_nodes()'関数の定義であると思われます。 'unload()'はルートノードを引数として 'release_nodes()'を呼び出す別の関数でなければなりません。 – Barmar

答えて

2

release_nodes()関数を宣言しないで定義する必要があります。

void release_nodes (node* node_to_free) { 
    //looking for children node to free 
    for (int i = 0; i < 27; i++) 
    { 
     if (node_to_free -> children[i]) 
     { 
      release_nodes (node_to_free -> children[i]); 
     } 
    } 

    free (node_to_free); 
} 

次に、あなたがunload()からこの関数を呼び出す:

bool unload(void) { 
    if (root_node) { 
     release_nodes(root_node); 
     root_node = NULL; 
    } 
    return false; 
} 

は、あなたのツリーのルートを保持するグローバル変数の名前でroot_nodeを交換してください。

+0

公正であるために、OPのアンロード機能はブールでした.... – polarysekt

+0

右、彼らは混乱しました。なぜそれが常に「偽」を返すのかは謎です。 – Barmar

+0

ありがとうございます。問題は解決されました。 – doublestanding

関連する問題