Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.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
Arrays 如何将非基本对象数组写入Arduino EEPROM,然后在每次程序启动时将数组读入内存_Arrays_Arduino_Eeprom - Fatal编程技术网

Arrays 如何将非基本对象数组写入Arduino EEPROM,然后在每次程序启动时将数组读入内存

Arrays 如何将非基本对象数组写入Arduino EEPROM,然后在每次程序启动时将数组读入内存,arrays,arduino,eeprom,Arrays,Arduino,Eeprom,我正在为电子产品的最后一年项目开发一个药丸提醒器。我需要存储药丸的名称、服用次数、服用时间以及当前是否有效。我创建了一个类pill,如下所示,并将这些pill存储在一个数组中: class Pill{ public: String pillName = "Nothing"; boolean pillTaken = true; int hours[6]; boolean active = false; int

我正在为电子产品的最后一年项目开发一个药丸提醒器。我需要存储药丸的名称、服用次数、服用时间以及当前是否有效。我创建了一个类pill,如下所示,并将这些pill存储在一个数组中:

class Pill{
    public:
        String pillName = "Nothing";
        boolean pillTaken = true;
        int hours[6]; 
        boolean active = false;
        int count = 0; 
};

Pill pills[6];
现在我想将这些数据保存在Arduino EEPROM中,如何将药丸数组写入EEPROM,并在每次程序启动时将数据读入内存。此外,每次收到修改pill的命令时,我都需要更新数组,并放入新值

EEPROM.put(地址、数据)
让我们在EEPROM中存储任何类型的数据。get(地址、数据)从EEPROM返回任何对象

#include <EEPROM.h>
[...]
class Pill{
  public:
    String pillName = "Nothing";
    boolean pillTaken = true;
    int hours[6]; 
    boolean active = false;
    int count = 0; 
};
Pill pills[6];
//Assigning data to pills array in here...
[...]
EEPROM.put(address,pills)
[...]
//Getting saved pills array
Pill savedPills[]; //I'm not sure if you'd have to initialize the size...
EEPROM.get(address,savedPills)
#包括
[...]
类丸{
公众:
字符串pillName=“无”;
布尔值=真;
整小时[6];
布尔活动=假;
整数计数=0;
};
避孕药[6];
//正在将数据分配给此处的数组。。。
[...]
EEPROM.put(地址、地址)
[...]
//获取保存的药丸数组
避孕药[]//我不确定你是否需要初始化大小。。。
EEPROM.get(地址,保存的票据)
您可以在arduino.cc中查看完整的示例:


@Galarzaa90为您指出了正确的信息,但是,EEPROM库不能与String类一起使用

为什么?

由于实际字符串数据不存储在对象内存空间中,因此它只包含指向其他位置的动态内存的指针

如果保存字符串对象,则将保存其长度、缓冲区大小和指向数据的指针。但是,当您重新启动duino并从EEPROM加载字符串时,指针将指向。。。任何地方,除了你期望的地方


您需要使用cstring/char数组,这意味着字符串数据实际上存储在
Pill
类中。

尽管您的答案看起来正确,但它对字符串不起作用。正确的信息。我是否可以将
pillName
变量存储为字符数组,并将其读回
String
,因为我需要使用字符串的功能?我的解决方案是创建一个不同的类,将名称存储为数组并保存到EEPROM,然后读取它并将信息复制到我的
pills
类。您不能直接读取它,但是如果
pillName
它是一个以null结尾的字符串,您可以执行以下操作:
string myString=pillName
一旦从EEPROM加载了
pillName
。我不得不添加一个
\0
作为最后一个字符,它就工作了。我不确定这是否是正确的方法?是的,String类希望在其输入上有一个空终止符。它使用它来确定要复制的cstring的长度。@EdmoreMGoneseDigolodollarz另外,您可以看到这是字符串的默认值:
sizeof(“test”)
将等于5,因为它会在结尾隐式添加空字符。不确定您是否收到了我对您在我的答案上发表的评论的回复。我没有@your name,所以这条消息应该会给你一个通知。