2013-10-16 87 views
8

我想提出一個可靠的數據傳輸協議和具備的功能原型C編譯 - 「未定義引用」?

void tolayer5(int, char data[]); 

隨着structs

struct msg { 
    char data[20]; 
}; 

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

而當我把這種格式的功能:

tolayer5(A, packet.payload); 

在哪裏Aintpacket.payloadstruct pkt,我得到了err或「未定義的參考'tolayer5(int, char*)'。你能幫我看看我在這裏錯過了什麼嗎?

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

謝謝大家與原來的問題幫助! :)然而,當我試圖解決這個問題時,我遇到了一個無限循環,我認爲這與我對一個數組中的字符進行錯誤地處理有關(這已經過去了一段時間,因爲我已經完成了C這樣的事情。你能幫我找到在哪裏我創建一個無限循環

我已經更新上面的代碼是什麼,我現在工作的通知的主要變化已經給我的功能:?

void tolayer5(int AorB, char data[]) 

而此行的內部功能:printf("%c",msgReceived.data[i]);從現在開始它只是:

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

這是一個鏈接錯誤,你確定你也在執行'void tolayer5(int,char data []);'? – orlp

+0

是在您的項目中實現tolayer5的c文件。 – drescherjm

+1

重新編輯:您的原型與其實現不兼容。 char [] vs結構味精。 –

回答

11

看來你需要實現tolayer5()

更新OBJ文件鏈接: 你的函數聲明不匹配的實現:

 void tolayer5(int AorB, struct msg msgReceived) 
     void tolayer5(int, char data[]) 

所以編譯器將它們視爲兩個不同的功能(你正在使用C++)。它無法找到您在main()中調用的實現。

+0

就是這樣,我的tolayer5()函數不在對象文件中;它在同一個文件中,只是降低了。 –

+0

啊,我明白了!我一定不會改變我先前調用函數的方式。謝謝! :) –

1

請確保您在使用它的文件的早期聲明tolayer5函數作爲原型,或者定義完整的函數定義。

+0

我的當前函數原型是我列出的(void tolayer5(int,char data []);)你的意思是像「void tolayer5(int blah1,char blah2 []);?當我嘗試時,它給了我同樣的錯誤。 –

1

正如其他人所述,這是一個鏈接錯誤。調用該函數的代碼段不知道這個函數是什麼。它需要在自己的源文件中定義的頭文件中聲明,或者在被調用的位置上定義或聲明在相同的源文件中。

編輯:在C,C89/C90的舊版本中,函數聲明實際上並不需要。所以,即使在調用和編譯器會推斷聲明之後,您也可以在使用該函數的文件中的任意位置添加該定義。例如,

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

int func() 
{ 
    return 1; 
} 

但是,今天這不是好習慣,大多數語言,例如C++都不允許它。一種避免在使用它的同一個源文件中定義函數的方法是在文件的開頭聲明它。所以,前面的例子看起來像這樣。

int func(); 

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

int func() 
{ 
    return 1; 
} 
+0

考慮到我列出的信息,將頂部正確的函數頭放在什麼位置?我真的不確定我缺少什麼來鏈接它。 :( –

+0

我編輯了我的答案,添加了一點澄清。 – dsell002