是否可以从类(Arduino)访问草图中的变量?

时间:2014-03-02 21:21:13

标签: c++ arduino

假设我想从我写的类

中获取草图中变量的值

草图

int device;
void setUp() {
   device = 1;
}

我上课了 SomeClass.cpp

void Device::checkTimedEvent() {
   someDevice = device; //variable from sketch
}

我知道可以从另一个类中访问成员,我可以在其中包含类并使用:: scope运算符,但不确定草图与类的关系。 感谢

4 个答案:

答案 0 :(得分:4)

看起来通常的C / C ++“extern”语法在Arduino中起作用,就像草图文件是.cpp文件一样:

草图:

int device = 123;

SomeClass.cpp:

extern int device;

void SomeClass::checkTimedEvent() {
   someDevice = device; // variable from sketch

   // will display "123" (or current value of device)
   // if serial output has been set up:
   Serial.println("device: " + String(device));
}

可能需要担心启动和初始化顺序,具体取决于项目的复杂程度。

答案 1 :(得分:-1)

class Test
{
  public:
    int N = 0;

};
Test t;
int someNumber = t.N;

答案 2 :(得分:-2)

执行此操作的最佳方法是将值作为参数传递给函数。这是一个简单的例子:

类别:

class Test
{
public:
    void doSomething(int v);

private:
    int myValue;
};

void Test::doSomething(int v)
{
     myValue = v;
}

草图:

Test t;
int someNumber;

void setup()
{
    someNumber = 27;
    t.doSomething(someNumber);
}

这里的setup()函数将全局变量someNumber传递给类的成员函数。在成员函数内部,它存储自己的数字副本。

重要的是要注意它具有完全独立的副本。如果全局变量发生变化,则需要再次传入。

答案 3 :(得分:-2)

尽管Bloomfiled的回答是正确的,但使用了更为公认的使用Getter和Setter函数的做法。下面演示了这一点,同时将属性设置为public并直接访问它。

class Test
{
public:
    void SetMyValue(int v);
    int  GetPublicValue();
    int  GetPrivateValue();
    int  myPublicValue;

private:
    int myPrivateValue;
};

void Test::SetMyValue(int v)
{
     myPublicValue = v;
     myPrivateValue = v;
}

int  Test::GetPublicValue()
{
     return myPublicValue;
}

int  Test::GetPrivateValue()
{
     return myPrivateValue;
}

Test t;
int someNumber;

void setup()
{
    someNumber = 27;
    t.SetMyValue(someNumber);         // set both private and public via Setter Function
    t.myPublicValue = someNumber;     // set public attribute directly.
    someNumber = t.GetPublicValue();  // read via Getter
    someNumber = t.GetPrivateValue();
    someNumber = t.myPublicValue;     // read attribute directly

}

void loop() {
  // put your main code here, to run repeatedly:
}