Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/156.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 库编译,但赢得';跑不动_C++_Arduino - Fatal编程技术网

C++ 库编译,但赢得';跑不动

C++ 库编译,但赢得';跑不动,c++,arduino,C++,Arduino,我编写了一些代码,用Arduino Uno板驱动外部7段显示器。在ArduinoIDE中作为.ino文件运行时,它工作得非常好。然后我决定把它变成一个图书馆,以备将来使用。我创建了.h和.cpp文件,但当我尝试使用与.ino相同的函数时,它们现在无法工作。这是我的密码: 伊诺先生 .cpp 编译器没有给出错误,但SSD只是空白。我在.cpp文件中运行了一个名为int test()的测试函数,该函数只返回了一个任意数字,并且工作正常。这使我认为include正在正常工作,并且所有三个文件都在通信。

我编写了一些代码,用Arduino Uno板驱动外部7段显示器。在ArduinoIDE中作为.ino文件运行时,它工作得非常好。然后我决定把它变成一个图书馆,以备将来使用。我创建了.h和.cpp文件,但当我尝试使用与.ino相同的函数时,它们现在无法工作。这是我的密码:

伊诺先生

.cpp


编译器没有给出错误,但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);
  }
}