带有数组的结构返回随机值



最近我拿到了NodeMCU esp8266。我正在试着建立一个警报系统。我有两个结构Alarm和AlarmInfo。我想做的是从文件系统中读取数据,解析它,并使用它来确定活动预设(AlarmInfo(。每个预设可以有多个警报,我使用一组警报。我不知道我做错了什么。当我尝试在dev-c++中运行相同的代码(对输出进行了一些更改(时,它成功了。这是代码:

#include <FS.h>
#include <LittleFS.h>

#include "AsyncJson.h"
#include "ArduinoJson.h"
//Alarm Struct
struct Alarm {
private:
int alarmHour;// 00 - 23;
int alarmMinute; // 00 - 59;
int duration; //undefined
public:
Alarm(int newAlarmHour, int newAlarmMinute, int newDuration) {
alarmHour = newAlarmHour;
alarmMinute = newAlarmMinute;
duration = newDuration;
}
Alarm() {}
int getAlarmHour() {
return alarmHour;
}
int getAlarmMinute() {
return alarmMinute;
}
int getAlarmDuration() {
return duration;
}
String toString() { // returns string representation only of the alarm (format: hh:mm)
char buffer[10];
sprintf(buffer, "%02u:%02u", alarmHour, alarmMinute);
return String(buffer);
}
String toStringDuration() { // returns string representation with duration (format: hh:mm/dd)
char buffer[20];
sprintf(buffer, "%02u:%02u:%d", alarmHour, alarmMinute, duration);
return String(buffer);
}
};
struct AlarmInfo {
private:
String name;
Alarm *alarms;
int alarmSize;
int *days;
int daySize;
boolean isActive;
public:
AlarmInfo() {}
AlarmInfo(String newName, Alarm newAlarms[], int newAlarmSize, int newDays[], int newDaySize, boolean newIsActive) {
name = newName;
alarms = newAlarms;
alarmSize = newAlarmSize;
days = newDays;
daySize = newDaySize;
isActive = newIsActive;
}
Alarm* getAlarms() {
return alarms;
};
void readVals() {
Alarm *temp = alarms;
Serial.print("Size: ");
Serial.println(alarmSize);
for (int i = 0; i < alarmSize; i++) {
Serial.println(temp++->toStringDuration());
}
}
};

void setup() {
Serial.begin(115200);
Serial.println("Hello There");

LittleFS.begin();
File file = LittleFS.open("/presetdata.json", "r");
if(!file) {
Serial.println("Cannot read the file");
}
DynamicJsonDocument data(8192);
deserializeJson(data, file);
loadAlarms(data.as<JsonArray>());
}
void loop() {
}

void loadAlarms(JsonArray jsonArray) {
AlarmInfo alarmInfos[jsonArray.size()];
////////////////////////Parsing JSON////////////////////////////////
for (int i = 0; i < jsonArray.size(); i++) {
JsonObject object = jsonArray[i].as<JsonObject>();
String alarmInfoName = object["Name"].as<String>();
JsonArray alarmsJsonArray = object["Alarms"].as<JsonArray>();
Alarm alarmArray[alarmsJsonArray.size()];
for (int j = 0; j < alarmsJsonArray.size(); j++) {
JsonObject alarmObject = alarmsJsonArray[j].as<JsonObject>();
int alarmHour = alarmObject["hour"];
int alarmMinute = alarmObject["minute"];
int duration = alarmObject["duration"];
alarmArray[j] = Alarm(alarmHour, alarmMinute, duration);
}
JsonArray daysJsonArray = object["Days"].as<JsonArray>();
int daysArray[daysJsonArray.size()];
for (int k = 0; k < daysJsonArray.size(); k++) {
daysArray[k] = daysJsonArray[k].as<int>();
}
bool isActive = object["Active"].as<bool>();
//////////////////////////////////////////////////////////////////////
alarmInfos[i] = AlarmInfo(alarmInfoName, alarmArray, alarmsJsonArray.size(),
daysArray, daysJsonArray.size(), isActive);
alarmInfos[i].readVals();
}
for (int i = 0; i < jsonArray.size(); i++) {
alarmInfos[i].readVals();
}
}

这是输出:

Size: 6
12:30:5
13:30:5
14:30:5
15:30:5
16:30:5
17:30:5
Size: 6
17:30:5
17:30:5
18:30:5
19:30:5
20:30:5
21:30:5
Size: 6
17:30:5
17:30:5
18:30:5
19:30:5
20:30:5
21:30:5
Size: 6
17:30:5
17:30:5
18:30:5
19:30:5
20:30:5
21:30:5
Size: 6
17:1073672900:107373
1075862441:825898801
943337780:959984946:
00:1310751:0
20:30:5
1073736416:06:0
Size: 6
17:1073672900:107373
1075862441:825898801
943337780:959984946:
00:1310751:0
20:30:5
1073736416:06:0
Size: 6
17:1073672900:107373
1075862441:825898801
943337780:959984946:
00:1310751:0
20:30:5
1073736416:06:0
Size: 6
17:1073672900:107373
1075862441:825898801
943337780:959984946:
00:1310751:0
20:30:5
1073736416:06:0

loadAlarms中,alarmArraydaysArray在for循环的每次迭代结束时都超出范围。对于快速解决方案,您可以使用动态分配:

Alarm* alarmArray = new Alarm[alarmsJsonArray.size()];

当然,你必须处理好交易。

最好使用类似std::vector的类。

最新更新