C++ 库编译,但赢得';跑不动
我编写了一些代码,用Arduino Uno板驱动外部7段显示器。在ArduinoIDE中作为.ino文件运行时,它工作得非常好。然后我决定把它变成一个图书馆,以备将来使用。我创建了.h和.cpp文件,但当我尝试使用与.ino相同的函数时,它们现在无法工作。这是我的密码: 伊诺先生 .cppC++ 库编译,但赢得';跑不动,c++,arduino,C++,Arduino,我编写了一些代码,用Arduino Uno板驱动外部7段显示器。在ArduinoIDE中作为.ino文件运行时,它工作得非常好。然后我决定把它变成一个图书馆,以备将来使用。我创建了.h和.cpp文件,但当我尝试使用与.ino相同的函数时,它们现在无法工作。这是我的密码: 伊诺先生 .cpp 编译器没有给出错误,但SSD只是空白。我在.cpp文件中运行了一个名为int test()的测试函数,该函数只返回了一个任意数字,并且工作正常。这使我认为include正在正常工作,并且所有三个文件都在通信。
编译器没有给出错误,但SSD只是空白。我在.cpp文件中运行了一个名为
int test()
的测试函数,该函数只返回了一个任意数字,并且工作正常。这使我认为include正在正常工作,并且所有三个文件都在通信。我在想,出于某种原因,它没有识别出#include“Arduino.h”
,因为某种原因,它正在扼杀我的digitalWrite()
和pinMode
函数。有人能帮我解释一下吗?谢谢。正如Brian在评论中指出的那样,在Segment类中将变量a、b、c、d、e、f、g和dot定义为私有成员,并将它们重新定义为全局常量。在Segments成员函数中调用pinMode()和digitalWrite()时,这些函数使用尚未初始化的类成员变量,而不是已初始化的全局变量
在段构造函数中,在调用pinMode()之前,初始化成员变量。段和全局常量的成员变量都有一个thru g。因为所有这些引用都是在类成员函数中,所以C++将使用未初始化的成员变量。所以,我将<代码> const <代码>定义移到内部<代码>分段()/<代码>,但是现在所有7个片段加上点亮,这意味着变量仍然不能正常工作。你不应该在构造函数中移动常量定义,你应该删除它们并初始化成员变量。如果需要成员为常量,只需使用成员初始值设定项列表。也许可以在设置每个管脚模式后显式关闭管段。太棒了。这非常有效。我在
段()
构造函数中使用了一个初始化列表。有人能解释一下为什么需要这样做吗?再次感谢。当您将变量移动到构造函数中时,您再次绕过了成员变量,并使用了函数局部变量。设置pin模式后,当您调用display()时,您的变量超出了范围,是伪造的值。通过在构造函数中正确初始化它们,变量包含display()要使用的有效数据。有关进一步的信息,请参见C++变量范围。
#include <Segment.h>
Segment seg;
void setup() {
}
void loop() {
seg.display(1);
}
#ifndef Segment_h
#define Segment_h
#include "Arduino.h"
class Segment
{
public:
Segment();
void display(int i);
private:
int a;
int b;
int c;
int d;
int e;
int f;
int g;
int dot;
};
#endif
#include "Segment.h"
const int a=6;
const int b=7;
const int c=8;
const int d=10;
const int e=11;
const int f=13;
const int g=12;
const int dot=9;
Segment::Segment()
{
pinMode(a, OUTPUT);
pinMode(b, OUTPUT);
pinMode(c, OUTPUT);
pinMode(d, OUTPUT);
pinMode(e, OUTPUT);
pinMode(f, OUTPUT);
pinMode(g, OUTPUT);
pinMode(dot, OUTPUT);
}
void Segment::display(int i)
{
if (i==0){
digitalWrite(a, LOW);
digitalWrite(b, LOW);
digitalWrite(c, LOW);
digitalWrite(d, LOW);
digitalWrite(e, LOW);
digitalWrite(f, LOW);
digitalWrite(g, HIGH);
digitalWrite(dot, HIGH);
}
else if (i==1){
digitalWrite(a, HIGH);
digitalWrite(b, LOW);
digitalWrite(c, LOW);
digitalWrite(d, HIGH);
digitalWrite(e, HIGH);
digitalWrite(f, HIGH);
digitalWrite(g, HIGH);
digitalWrite(dot, HIGH);
}
else if (i==2){
digitalWrite(a, LOW);
digitalWrite(b, LOW);
digitalWrite(c, HIGH);
digitalWrite(d, LOW);
digitalWrite(e, LOW);
digitalWrite(f, HIGH);
digitalWrite(g, LOW);
digitalWrite(dot, HIGH);
}
else if (i==3){
digitalWrite(a, LOW);
digitalWrite(b, LOW);
digitalWrite(c, LOW);
digitalWrite(d, LOW);
digitalWrite(e, HIGH);
digitalWrite(f, HIGH);
digitalWrite(g,LOW);
digitalWrite(dot, HIGH);
}
else if (i==4){
digitalWrite(a, HIGH);
digitalWrite(b, LOW);
digitalWrite(c, LOW);
digitalWrite(d, HIGH);
digitalWrite(e, HIGH);
digitalWrite(f, LOW);
digitalWrite(g, LOW);
digitalWrite(dot, HIGH);
}
else if (i==5){
digitalWrite(a, LOW);
digitalWrite(b, HIGH);
digitalWrite(c, LOW);
digitalWrite(d, LOW);
digitalWrite(e, HIGH);
digitalWrite(f, LOW);
digitalWrite(g, LOW);
digitalWrite(dot, HIGH);
}
else if (i==6){
digitalWrite(a, LOW);
digitalWrite(b, HIGH);
digitalWrite(c, LOW);
digitalWrite(d, LOW);
digitalWrite(e, LOW);
digitalWrite(f, LOW);
digitalWrite(g, LOW);
digitalWrite(dot, HIGH);
}
else if (i==7){
digitalWrite(a, LOW);
digitalWrite(b, LOW);
digitalWrite(c, LOW);
digitalWrite(d, HIGH);
digitalWrite(e, HIGH);
digitalWrite(f, HIGH);
digitalWrite(g, HIGH);
digitalWrite(dot, HIGH);
}
else if (i==8){
digitalWrite(a, LOW);
digitalWrite(b, LOW);
digitalWrite(c, LOW);
digitalWrite(d, LOW);
digitalWrite(e, LOW);
digitalWrite(f, LOW);
digitalWrite(g, LOW);
digitalWrite(dot, HIGH);
}
else if (i==9){
digitalWrite(a, LOW);
digitalWrite(b, LOW);
digitalWrite(c, LOW);
digitalWrite(d, HIGH);
digitalWrite(e, HIGH);
digitalWrite(f, LOW);
digitalWrite(g, LOW);
digitalWrite(dot, HIGH);
}
else if (i==10){
digitalWrite(a, HIGH);
digitalWrite(b, HIGH);
digitalWrite(c, HIGH);
digitalWrite(d, HIGH);
digitalWrite(e, HIGH);
digitalWrite(f, HIGH);
digitalWrite(g, HIGH);
digitalWrite(dot, LOW);
}
else if (i==11){
digitalWrite(a, HIGH);
digitalWrite(b, HIGH);
digitalWrite(c, HIGH);
digitalWrite(d, HIGH);
digitalWrite(e, HIGH);
digitalWrite(f, HIGH);
digitalWrite(g, HIGH);
digitalWrite(dot, HIGH);
}
}