C++ 检查结构中的更改
我正在开发一个库(供我自己使用),它通过i2c无缝地跨多个控制器同步结构。我让它大部分工作正常,但我想检查是否对结构进行了更改,以便在发生这种情况时开始同步 为了能够通过串行(i2c)发送数据,我将其转换为字符数组C++ 检查结构中的更改,c++,struct,arduino,C++,Struct,Arduino,我正在开发一个库(供我自己使用),它通过i2c无缝地跨多个控制器同步结构。我让它大部分工作正常,但我想检查是否对结构进行了更改,以便在发生这种情况时开始同步 为了能够通过串行(i2c)发送数据,我将其转换为字符数组 struct MyStruct { int a = 123; long b = 4567890; String c = "abc"; }; MyStruct myData; char bufferP[sizeof(myData)]; memcpy(bufferP, &a
struct MyStruct {
int a = 123;
long b = 4567890;
String c = "abc";
};
MyStruct myData;
char bufferP[sizeof(myData)];
memcpy(bufferP, &myData, sizeof(myData));
而在另一端,我是这样做的
memcpy(&myData, bufferP, sizeof(bufferP));
使其返回到结构。很好
我曾尝试通过bufferP
来检查更改,以便知道何时进行同步,但只有在值中的字符数不同时才会更改
外汇。如果结构是这样的
struct MyStruct {
int a = 123;
long b = 4567890;
String c = "abc";
};
0 -> 123
1 -> 0
2 -> 82
3 -> 179
4 -> 69
5 -> 0
6 -> 143
7 -> 2
8 -> 3
9 -> 0
10 -> 3
11 -> 0
struct MyStruct {
int a = 123;
long b = 4567890;
String c = "def";
};
它将输出类似这样的内容
struct MyStruct {
int a = 123;
long b = 4567890;
String c = "abc";
};
0 -> 123
1 -> 0
2 -> 82
3 -> 179
4 -> 69
5 -> 0
6 -> 143
7 -> 2
8 -> 3
9 -> 0
10 -> 3
11 -> 0
struct MyStruct {
int a = 123;
long b = 4567890;
String c = "def";
};
如果结构像这样
struct MyStruct {
int a = 123;
long b = 4567890;
String c = "abc";
};
0 -> 123
1 -> 0
2 -> 82
3 -> 179
4 -> 69
5 -> 0
6 -> 143
7 -> 2
8 -> 3
9 -> 0
10 -> 3
11 -> 0
struct MyStruct {
int a = 123;
long b = 4567890;
String c = "def";
};
它将输出完全相同的内容
有人能告诉我为什么缓冲区没有变化吗?
当我把它放回一个结构时,这些变化就像它们应该发生的那样
当我不知道结构的结构时,如何检查结构是否已更改?您有两个选项:
字符[50]
。(或任何适合您的尺码。)什么类型的
String
?不是String c
中的指针吗代码>?代码如何传输该字符串的数据?这里它是一个字符串文字,所以比较(本地)指针可能有效,但假设它指向动态内存,其内容可能会更改?我猜string
不是简单的数据,它包含指针。指针不会使用您使用的技术进行序列化。但是为什么接收器控制器上的“字符串c”会按预期同步?@XerXeX“但是为什么接收器控制器上的“字符串c”会按预期同步?”如果没有更多关于环境的信息和更多准确显示您正在做什么的代码,很难判断。可能是纯粹的运气,指针恰好指向包含您期望的内容但没有任何保证的内存-问题中没有足够的信息可知道。您可能处于未定义的行为领域,“您期望的”与“在您测试的下一台机器上崩溃”一样有效。从提供的信息来看不可能。是的,但我不知道结构时不能这样做。嗯?你怎么能不知道这个结构?在任何情况下,在你的问题中,你肯定知道这个结构。是的,但这对于一个库来说,所以我不知道最终用户决定如何构建这个结构,只要发送方和接收方的结构相同,这就不重要了。那么,要求使用你的库的任何人都必须使用自包含的数据类型,如char[X]
而不是字符串
。