c++ - 逐元素从较小的数组转移到较大的数组
问题描述
我正在 Arduino 框架中编写 ESP32。对于我的应用程序,我需要创建一个缓冲区来存储当前和上次访问时的信息。这是我正在尝试做的事情。
//first buffer
char buffer1[4];
//second buffer
char buffer2[8];
void setup {
//setup
}
//buffer1 values will change with each iteration of loop from external inputs
//buffer2 must store most recent values of buffer1 plus values of buffer1 from when loop last ran
for example:
**loop first iteration**
void loop {
buffer1[0] = {1};
buffer1[1] = {2};
buffer1[2] = {3};
buffer1[3] = {1};
saveold(); //this is the function I'm trying to implement to save values to buffer2 in an element-wise way
}
//value of buffer2 should now be: buffer2 = {1,2,3,1,0,0,0,0}
**loop second iteration**
void loop {
buffer1[0] = {2};
buffer1[1] = {3};
buffer1[2] = {4};
buffer1[3] = {2};
saveold();
}
//value of buffer2 should now be: buffer2 = {2,3,4,2,1,2,3,1}
从我通过在线搜索了解到的情况来看,我正在尝试制作的“saveold”函数应该为这些数组操作实现某种形式的 memmove
我试图将它拼凑起来,但我总是覆盖 buffer2 的值,而不是以某种方式将新值移入,同时保留旧值
这就是我所拥有的:
void saveold() {
memmove(&buffer2[0], &buffer1[0], (sizeof(buffer1[0]) * 4));
}
据我了解,这会将 buffer1 从索引位置 0 开始复制到 buffer2,从索引位置 0 开始,共 4 个字节(其中 1 个字符 = 1 个字节)。
计算机科学不是我的背景,所以也许我缺少一些基本的解决方案或策略。任何指针将不胜感激。
解决方案
正确的方法是使用缓冲区指针,而不是进行硬拷贝备份。使用 memcpy 进行硬拷贝在慢速传统微控制器(如 AVR)上尤其糟糕。不太清楚这个 ESP32 得到了什么 MCU,似乎是来自 Tensilica 的一些奇怪的 MCU。无论如何,这个答案普遍适用于任何数据多于 CPU 数据字长的处理器。
也许我缺少一些基本的解决方案或策略。
确实 - 听起来您正在寻找的是一个环形缓冲区。也就是说,一个固定大小的数组,它有一个指向有效数据开头的指针,另一个指向数据末尾的指针。您移动的是指针,而不是数据。与使用memcpy
.
推荐阅读
- ruby-on-rails - Ruby 用守卫替换 if 块
- linux - 如何将回显输出同时重定向到 STDOUT 和变量?
- elasticsearch - 匹配 Elastic Search 中存储的值和查询
- javascript - Javascript 在数组中切换显示
- python - 如何在 Python 中的字符串列表末尾删除多个子字符串?
- android - 用于以编程方式更新 apk 的 Xamarin 应用程序
- python - 列出了制作图形可视化程序的问题
- xamarin - Xamarin.Forms 应用程序不会在没有清理/重建解决方案的情况下应用来自第二个项目程序集的代码更改
- python - 在忽略大小写的情况下按多列对数据框进行排序
- python - 无法将 dicts 字符串加载到 JSON 中