C++ 检查结构中的更改

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

我正在开发一个库(供我自己使用),它通过i2c无缝地跨多个控制器同步结构。我让它大部分工作正常,但我想检查是否对结构进行了更改,以便在发生这种情况时开始同步

为了能够通过串行(i2c)发送数据,我将其转换为字符数组

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]
    而不是
    字符串