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