2013-10-16 14 views
8

Ich mache ein zuverlässiges Datenübertragungsprotokoll und die Funktion PrototypC kompilieren - "undefinierter Bezug auf"?

void tolayer5(int, char data[]); 

Mit den structs

struct msg { 
    char data[20]; 
}; 

struct pkt { 
    int seqnum; 
    int acknum; 
    int checksum; 
    char payload[20]; 
}; 

Und wenn ich rufe die Funktion in diesem Format:

tolayer5(A, packet.payload); 

Wo A ist ein int und packet.payload ist ein struct pkt, ich bekomme den Fehler oder "undefinierter Verweis auf 'tolayer5(int, char*)'. Kannst du mir helfen zu sehen, was ich hier vermisse?

void tolayer5(int AorB, char data[]) 
{ 
    int i; 
    if (TRACE>2) 
    { 
    printf("TOLAYER5: data received:"); 
    for (i=0; i<20; i++) 
     printf("%c",data[i]); 
    printf("\n"); 
    } 
} 

Vielen Dank an alle mit dem ursprünglichen Problem für die Unterstützung! :) Als ich versuchte, diesen Fehler zu beheben, stieß ich jedoch auf eine Endlosschleife, von der ich denke, dass sie etwas damit zu tun hat, dass ich Zeichen in einem Array falsch adressiere (es ist eine Weile her, dass ich so vorgegangen bin. Kannst du mir helfen?) finden, wo ich eine Endlosschleife bin Erstellen

ich den obigen Code aktualisiert haben, was bin ich jetzt mit Arbeits Beachten Sie die wichtigsten Änderungen an meiner Funktion gewesen sein:?.

void tolayer5(int AorB, char data[]) 

Und diese Linie im Inneren die Funktion: printf("%c",msgReceived.data[i]); seit jetzt ist es gerade:

printf("%c",data[i]); 
+1

Dies ist ein Verknüpfungsfehler, sind Sie sicher, dass Sie auch in der Implementierung für 'void tolayer5 (int, char data []) verknüpfen;'? – orlp

+0

Ist die c-Datei, die toolayer5 in Ihrem Projekt implementiert. – drescherjm

+1

zu Ihrer Bearbeitung: Ihr Prototyp ist mit seiner Implementierung nicht kompatibel. char [] vs Struktur msg. –

Antwort

11

scheint, dass Sie mit der OBJ-Datei verknüpfen müssen, die tolayer5()

-Update implementiert: Ihre Funktionsdeklaration die Umsetzung nicht übereinstimmt:

würde behandeln sie als zwei verschiedene Funktionen
 void tolayer5(int AorB, struct msg msgReceived) 
     void tolayer5(int, char data[]) 

So Compiler (Sie verwenden C++). und es kann die Implementierung für die, die Sie in main() aufgerufen haben, nicht finden.

+0

Das ist es nur, meine toolay5() Funktion ist nicht in einer Objektdatei; Es ist in der gleichen Datei, nur weiter unten. –

+0

Ahhh, ich verstehe! Ich habe meine frühere Art, die Funktion zu nennen, nicht geändert. Vielen Dank! :) –

1

Stellen Sie sicher, dass Sie die tolayer5-Funktion als Prototyp deklarieren, oder definieren Sie die vollständige Funktionsdefinition früher in der Datei, in der Sie sie verwenden.

+0

Mein aktueller Funktionsprototyp ist der, den ich aufgelistet habe (void tolayer5 (int, char data []);) Meinst du sowas wie "void tolayer5 (int blah1, char blah2 []) ;?" Wenn ich das versuche, gibt es mir den gleichen Fehler. –

1

Wie von einigen anderen angegeben, ist dies ein Verknüpfungsfehler. Der Codeabschnitt, in dem diese Funktion aufgerufen wird, weiß nicht, was diese Funktion ist. Es muss entweder in einer Header-Datei deklariert werden, in einer eigenen Quelldatei definiert werden, oder in der gleichen Quelldatei definiert oder deklariert werden, über der es aufgerufen wird.

Edit: In älteren Versionen von C, C89/C90, wurden Funktionsdeklarationen nicht wirklich benötigt. Sie können also die Definition an einer beliebigen Stelle in der Datei hinzufügen, in der Sie die Funktion verwenden, auch nach dem Aufruf, und der Compiler würde auf die Deklaration schließen. Beispiel:

Dies ist jedoch keine gute Praxis heute und die meisten Sprachen, C++ zum Beispiel, wird es nicht zulassen. Eine Möglichkeit, die Funktion in derselben Quelldatei, in der Sie sie verwenden, zu definieren, besteht darin, sie am Anfang der Datei zu deklarieren. So würde das vorherige Beispiel stattdessen so aussehen.

int func(); 

int main() 
{ 
    int a = func(); 
} 

int func() 
{ 
    return 1; 
} 
+0

Was wäre der korrekte Funktionskopf, der bei den angegebenen Informationen ganz oben steht? Ich bin mir wirklich nicht sicher, was ich vermisse, um es zu verknüpfen. :( –

+0

Ich habe meine Antwort bearbeitet, um ein wenig Klärung hinzuzufügen. – dsell002

Verwandte Themen