2

我为图形 LCD 制作的库中的一些函数遇到了一个非常奇怪的问题,该 LCD 通过硬件串行与我的 arduino 通信。它只是屏幕使用的串行协议的简单包装器。

基本上,每当我从这个库中调用某些函数时,我都会收到“未定义的引用...”错误。但是,其他功能工作正常,我无法辨别正在工作的功能和不工作的功能之间的任何语法差异。

例如,我有一个盒子功能。当我调用它并给它四个整数时,它期望它可以正常工作。fill_box, 和circle, 和 也是如此erase_box

但是像backlight或者offset甚至被调用的函数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.offsetobj.blacklight和相同pixel

我只是不知道为什么会这样。而且我开始感到非常沮丧,因为我什至不能编写一个简单的库......无论如何,这是有问题的库:

这是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
4

3 回答 3

3

如果您arg()在 class 中声明了一个函数gLCD,则应该稍后将其定义为

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

即,您必须使用显式gLCD::前缀来引用先前声明的函数,就像您使用gLCD::box,gLCD::circle和其他“工作”函数所做的那样。为什么你正确定义了那些旧函数(用gLCD::)然后突然开始省略那个前缀?

您当前在那里定义的新函数(argoffsetbacklight)被编译器视为简单的独立全局函数。gLCD他们与你的班级无关。同时,函数gLCD::arg, gLCD::offset,gLCD::backlight仍未定义,这就是您收到这些错误的原因。

如果您想在类定义(内联)中定义这些新函数那么您可以在没有显式gLCD::前缀的情况下执行此操作。但是由于您是在类定义之外执行此操作,因此在不同的文件中,您必须使用限定名称,例如gLCD::arg.

于 2012-10-26T00:02:19.030 回答
0

您忘记gLCD::gLCD.cpp. 关闭类前缀意味着您声明了一个全局函数而不是类成员函数。

于 2012-10-25T23:59:35.587 回答
0

您的 arg、offset、backlight、line、pixel 函数不是作为 gLCD 类的一部分编写的

改变

void arg()

void gLCD::arg()
于 2012-10-26T00:01:33.500 回答