C++ 串行输出完全错误->;我做错了什么?

C++ 串行输出完全错误->;我做错了什么?,c++,arduino,C++,Arduino,由于我的代码的输出是完全奇怪的(对我来说),我真的非常感谢任何帮助 我必须上课:传感器和自动化。sensor类的对象保存有关此传感器的所有信息(我删除了许多代码以将其简化为当前问题)。自动化类将检查所有传感器,并根据测量结果作出反应。 传感器对象存储在automation中,以减少使用的RAM内存 class sensor { public: // Constructor sensor(const char* sensorName) { // Store name in obj

由于我的代码的输出是完全奇怪的(对我来说),我真的非常感谢任何帮助

我必须上课:
传感器
自动化
。sensor类的对象保存有关此传感器的所有信息(我删除了许多代码以将其简化为当前问题)。自动化类将检查所有传感器,并根据测量结果作出反应。 传感器对象存储在automation中,以减少使用的RAM内存

class sensor {

 public:

 // Constructor
 sensor(const char* sensorName) {
    // Store name in object
    setName(sensorName);
 }

 void addGroup(int newGroup) {
    for (int i=0; i <= (5); i++){ // Max. 5 groups
      if(groups[i] == 0) {
        groups[i] = newGroup;
        break;
      }
    }
 }


 int* getGroups() {
   return groups;
 }

 bool getIsObject() {
   return isObject;
 }

 char* getName() {
   return name;
 }

  void setName(const char* sensorName) {
    strcpy(name, sensorName); // Copy sensorName to name

    // Alternative:
    /*
    char i=0;

    do{
        name[i] = sensorName[i];
        ++i;
    }while(sensorName[i]!=0); //since a cstring is always null terminated.

    name[i] = 0;
    */
  }

 void setObject() {
    isObject = true;
 }

  private:

  int groups[5] = {0}; // Default group for all: 0
  bool isObject = false;
  char name [20]; // Max. 20 characters in name
};



class automation {
 public:

   automation() {
   }

  void run() {
      for(int i=0;i<3;i++) {
        Serial.println("Printing sensor information");
        Serial.print("Name: ");
        Serial.println(sensors[i]->getName());
        Serial.println("Group: ");
        Serial.println(sensors[0]->getGroups()[i]);
      }
   }//function


 // Füge Sensor-Instanz zu Sensor-Liste hinzu, um schlussendlich auf alle Sensoren zugreifen zu können
 int storeSensor(sensor *newSensor) {
   newSensor->setObject(); // Setze Variable isObject in Sensor-Instanz auf true
   int n = 0;
   for (int i=0; i < (sizeof(sensors)/sizeof(newSensor)-1); i++)
   {
     n=i;
     if(!sensors[i]->getIsObject()) {
       sensors[i] = newSensor;
       break;
     }
   }
   return n; // Liefert Array-Index / Stelle in Array, an der der Sensor gespeichert wurde.
 }



 private:
 sensor *sensors[5]; // Max. 5 sensors in the array

};

automation automation;

void setup() {
  Serial.begin(115200);
  delay(2000);
  Serial.println("Serial interface started");


  sensor moistureSensor("moistureSensor");
  moistureSensor.addGroup(1);
  moistureSensor.addGroup(3);

  automation.storeSensor(&moistureSensor);
}


void loop() {
  Serial.println("Start loop()");
  automation.run();
  delay(2000);
}

因此,组与添加的组不匹配,并且传感器名称为空。为什么

我现在没有时间写一个合适的答案,但两个直接的问题是1。
setup()
函数结束时,
湿度传感器的生存期结束(程序可能会重用
&moistureSensor
指向的字节-读取是无害的,但也没有意义,但写入可能是灾难性的)。二,<代码>如果(!sensors[i]->getIsObject())
您正在解引用单元化内存。当您第一次调用
storeSensor
时,不知道
sensors[0]
指向什么,因为我们不知道
sensors[0]
的值是什么,如果我们这样做了,它就不会被用于传感器。哦,天哪。第一点很简单。。。。谢谢但我不明白你的第二点。根据我的理解,应该发生以下情况:默认情况下,
sensor:isObject
false
。如果调用了
automation:storeSensor()
,则检查存储在
传感器
阵列中的所有现有传感器的
isObject
是否为false。如果是,则新传感器的
isObject
应设置为
true
。据我所知,即使是传感器[0]也可以对此进行检查。或者我误解了什么?“解除对初始化内存的引用”是什么意思?当您通过调用
automation automation
(顺便说一句,命名类
automation
,以便读者能够区分对象和类)来构造
自动化
时,成员
传感器*传感器[5]
已构建-留出空间供五个
传感器*
对象使用。但只有指针。没有为您希望这些传感器*指向的
传感器
对象留出空间。动态内存分配在Arduino上是如何工作的?我读到没有
new
关键字,STL也不是标准的。如果可以使用STL实现,请使用
vector
string
而不是数组和
char*
。否则,您可以将
传感器
初始化为
传感器
s的数组,而不是
传感器*
s的数组。(这将增加
自动化对象的大小,但无论如何你都必须将
传感器存储在某个地方。再说一遍,你不是Arduino的内存管理专家。与
数组
字符*
相比,
向量
字符串
的优点是什么?现在最好的解决方案是将
传感器
声明为
传感器阵列
-我已经使用了它,但它填满了我的RAM,所以我将其更改为
传感器阵列*
(当然这减少了它,但我没有看到生命周期的意义)。是否有可能不将此阵列存储在RAM中,而是存储在闪存中,仅在需要时获取元素?
Printing sensor information
Name: 
Group: 
255
Printing sensor information
Name: 
Group: 
20480
Printing sensor information
Name: 
Group: 
10