2

ハードウェア シリアル経由で arduino と通信するグラフィカル LCD 用に作成したライブラリの一部の関数で、非常に奇妙な問題が発生しています。これは、画面が使用するシリアル プロトコルの単純なラッパーです。

基本的に、このライブラリから特定の関数を呼び出すたびに、「...への未定義の参照」エラーが発生します。ただし、他の関数は正常に動作し、動作している関数と動作していない関数の構文上の違いはわかりません。

たとえば、ボックス機能があります。私がそれを呼び出して、期待している4つの整数を与えると、正常に動作します。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::boxgLCD::circleやその他の「機能する」関数で行ったのと同じです。古い関数を ( でgLCD::) 正しく定義したのに、突然そのプレフィックスを省略し始めたのはなぜですか?

現在そこに定義されている新しい関数 ( arg、など) はoffsetbacklightコンパイラによって単純な独立したグローバル関数として認識されます。gLCD彼らはあなたのクラスとは何の関係もありません。一方、関数gLCD::arg、は未定義gLCD::offsetgLCD::backlightままであるため、これらのエラーが発生しています。

これらの新しい関数をクラス定義gLCD::(インライン) で定義したい場合は、明示的な接頭辞なしで実行できます。ただし、クラス定義ので別のファイルで実行しているため、 のような修飾名を使用する必要がありますgLCD::arg

于 2012-10-26T00:02:19.030 に答える
0

gLCD::のいくつかの関数に追加するのを忘れましたgLCD.cpp。クラス プレフィックスをオフのままにしておくと、クラス メンバー関数の代わりにグローバル関数を宣言することになります。

于 2012-10-25T23:59:35.587 に答える
0

引数、オフセット、バックライト、ライン、ピクセル関数が gLCD クラスの一部として記述されていません

変化する

void arg()

void gLCD::arg()
于 2012-10-26T00:01:33.500 に答える