2012-10-25 51 views
2

我有一個非常奇怪的問題,在庫中的一些函數中我使用了一個圖形化的液晶顯示屏,它通過硬件序列與我的arduino進行通信。這只是屏幕使用的串行協議的簡單包裝。我的書架中隨機未定義的參考文獻

基本上,每當我從該庫中調用某些函數時,我都會收到「Undefined Reference ...」錯誤。然而,其他功能正常工作,我無法辨別正在工作的人和沒有正在工作的人之間的語法差異。

例如,我有一個箱子功能。當我打電話給它,並給它的四個整數,它期待它工作正常。 fill_box,circleerase_box也是如此。

但是像backlightoffset或甚至被稱爲arg(反映我當時感受的方式)的函數會導致代碼觸發未定義的引用。我無法弄清楚爲什麼......我的錯誤是什麼?

下面是正常工作的代碼示例:

#include <gLCD.h> 

gLCD obj = gLCD(); 

void setup(){ 
    obj.fill_box(0,0,60,60); 
    obj.erase_box(5,5,15,15); 
    obj.circle(50,50,25); 
} 

void loop(){delay(1000);} 

但只要我添加任何東西像obj.line,這樣

#include <gLCD.h> 

gLCD obj = gLCD(); 

void setup(){ 
    obj.fill_box(0,0,60,60); 
    obj.erase_box(5,5,15,15); 
    obj.circle(50,50,25); 
    obj.line(0,0,40,40); 
} 

void loop(){ 
    delay(1000); 
} 

然後我得到一個未定義的引用。與obj.offset,obj.blacklightpixel相同。

我只是不知道爲什麼會發生這種情況。而且我開始變得真的很沮喪,我甚至不能寫一個簡單的庫......總之,這裏的問題庫:

這是gLCD.cpp

#include "gLCD.h" 

HardwareSerial Uart = HardwareSerial(); 

gLCD::gLCD(){ 
    Uart.begin(115200); 
} 

void gLCD::box(int x1, int y1, int x2, int y2){ 
    Uart.write(0x7C); 
    Uart.write(0x0F); 
    Uart.write(x1); 
    Uart.write(y1); 
    Uart.write(x2); 
    Uart.write(y2); 
    Uart.write(0x01); 
} 

void gLCD::fill_box(int x1, int y1, int x2, int y2){ 
    Uart.write(0x7C); 
    Uart.write(0x12); 
    Uart.write(x1); 
    Uart.write(y1); 
    Uart.write(x2); 
    Uart.write(y2); 
    Uart.write(0xFF); 
} 

void gLCD::circle(int x1, int y1, int rad){ 
    Uart.write(0x7C); 
    Uart.write(0x03); 
    Uart.write(x1); 
    Uart.write(y1); 
    Uart.write(rad); 
    Uart.write(0x01); 
} 

void gLCD::erase_block(int x1, int y1, int x2, int y2){ 
    Uart.write(0x7C); 
    Uart.write(0x05); 
    Uart.write(x1); 
    Uart.write(y1); 
    Uart.write(x2); 
    Uart.write(y2); 
} 

void arg(){ 
    Uart.print("this is bullsh*t!"); 
} 

void offset(int x1, int y1){ 
    Uart.write(0x7C); 
    Uart.write(0x18); 
    Uart.write(x1); 

    Uart.write(0x7C); 
    Uart.write(0x19); 
    Uart.write(y1); 
} 

void backlight(int duty_cycle){ 
    Uart.write(0x7C); 
    Uart.write(0x02); 
    Uart.write(duty_cycle); 
} 

void line(int x1, int y1, int x2, int y2){ 
    Uart.write(0x7C); 
    Uart.write(0x0C); 
    Uart.write(x1); 
    Uart.write(y1); 
    Uart.write(x2); 
    Uart.write(y2); 
    Uart.write(0x01); 
} 

void pixel(int x ,int y ,int sr){ 
    Uart.write(0x7C); 
    Uart.write(0x10); 
    Uart.write(x); 
    Uart.write(y); 
    Uart.write(sr); 
} 

這是gLCD.h :

#ifndef gLCD_h 
#define gLCD_h 

#include <Arduino.h> 

class gLCD{ 

    public: 
     gLCD(); 
     void box(int x1, int y1, int x2, int y2); 
     void fill_box(int x1, int y1, int x2, int y2); 
     void circle(int x1, int y1, int rad); 
     void offset(int x1, int y1); 
     void backlight(int duty_cycle); 
     void line(int x1, int y1, int x2, int y2); 
     void pixel(int x ,int y ,int sr); 
     void erase_block(int x1, int y1, int x2, int y2); 
     void arg(); 
}; 

#endif 
+0

哇;我覺得自己像個白癡。謝謝,雖然;現在我可以繼續努力。但該死的...哈哈 –

回答

3

如果你聲明的函數arg()在類gLCD中,您應該稍後將其定義爲

void gLCD::arg() 
{ 
    // whatever 
} 

即你必須使用一個明確的gLCD::前綴來引用先前聲明的功能,就像你與gLCD::boxgLCD::circle和其他「工作」的功能做到了。你爲什麼要正確定義這些舊功能(使用gLCD::),然後突然開始忽略該前綴?

編譯器將您當前在其中定義的新功能(argoffsetbacklight等)視爲簡單獨立的全局函數。他們與你的gLCD課無關。同時,功能gLCD::arg,gLCD::offset,gLCD::backlight保持未定義,這就是爲什麼你會收到這些錯誤。

如果你想定義權類定義(在線)這些新的功能,那麼你可以做到這一點沒有明確gLCD::前綴。但是因爲你在之外的類定義,在另一個文件中,你必須使用一個限定的名字,比如gLCD::arg

+0

謝謝!現在我想起來非常愚蠢的錯誤。 –

0

你忘了添加gLCD::到您的一些功能gLCD.cpp。將類前綴關閉意味着您聲明瞭全局函數而不是類成員函數。

+0

我不能相信我錯過了。謝謝! –

0

你的阿根廷,偏移,背光源,線,像素功能都沒有寫成你的GLCD類的一部分

變化

void arg() 

void gLCD::arg() 
+0

哦,男人......謝謝。不能相信我錯過了這一點。 –