2017-02-20 2 views
-1

Dies ist der Entladefunktionscode.Wie debugge "undefinierte Referenz" in meiner C entladen Funktion?

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; 
} 

Dies ist die Antwort, die ich erhalte, wenn ich kompiliere.

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

Und wo ist 'release_nodes' definiert? In welcher Quelldatei? Bauen Sie mit dieser Datei? –

+1

Auch das Deklarieren einer Funktion in einer anderen Funktion ist wahrscheinlich nicht das, was Sie wollen (obwohl das nicht falsch ist). Sie sollten die Deklaration lieber in eine Header-Datei verschieben. – ForceBru

+0

Es sieht so aus, als ob dies die Definition der Funktion 'release_nodes()' ist. 'unload()' sollte eine separate Funktion sein, die 'release_nodes()' mit dem Wurzelknoten als Argument aufruft. – Barmar

Antwort

2

Sie sollten die release_nodes()-Funktion definieren, nicht deklarieren.

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); 
} 

Dann rufen Sie diese Funktion aus unload():

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

ersetzen root_node mit dem Namen der globalen Variablen, die die Wurzel des Baumes hält.

+0

Um fair zu sein, war die Entladefunktion des OP bool .... – polarysekt

+0

Richtig, habe sie verwirrt. Obwohl, warum es immer "falsch" zurückkehren würde, ist ein Geheimnis. – Barmar

+0

Danke an euch alle. Das Problem wurde behoben. – doublestanding