c++ - 如何将数据从一个结构链接到另一个结构

标签 c++ c struct teensy

我正在对 ArtNet 存储库进行一些更改。我想稍微扩展一下,但为了有效地做到这一点,我有几个问题我不知道答案。 请考虑下面的代码片段。 正如你所看到的,我有三个结构:

  • ArtNetNode:包含所有节点标识信息。 IP 和短/长名称当然可以在计划期间更改。
  • ArtPollReplyPack:此结构附加了打包参数。我稍后会使用这个结构,以便发送 udp 数据包。它确实是 artnet 协议(protocol)规范中指定的整个包。
  • ArtDmxPack:与第二点类似,但它是为了证明节点结构中的数据用于多个数据包中。

当前的实现保留了很多特定信息的拷贝,我指的是 IP 地址、mac、短名称和长名称。如果这些参数之一发生变化,我需要在所有三个位置上更改它。这不是很有效。 我的问题是如何才能提高效率,所以我只需更改 node.ip 而不是所有三个位置。搜索让我找到了指针,这确实很有意义。然而,我认为这会扰乱结构打包,因为 ArtPollReplyPack 和 ArtDmxPack 实际上是包的完整数据集。有谁能帮助我克服这个问题吗?也许可以举个例子。

感谢您的宝贵时间!

仅供引用:我正在带有 Wiz8xx 以太网端口的 Teensy 3.2 板上使用 Teensyduino 实现。

#include <Ethernet.h>
#include <EthernetUdp.h>

EthernetUDP Udp;

byte mac[] = {0x04, 0xE9, 0xE5, 0x00, 0x69, 0xEC};
IPAddress controllerIP(192, 168, 0, 2);

struct ArtNetNode {
  IPAddress  ip;
  uint8_t  mac[6];
  uint8_t  oemH;            
  uint8_t  oemL;
  uint8_t  shortname[18];
  uint8_t  longname[64];
};

struct ArtPollReplyPack {
  uint8_t  id[8];
  uint16_t opCode;          
  uint8_t  ip[4];
  uint8_t  mac[6];           
  uint16_t port;
  uint8_t  oemH;          
  uint8_t  oemL;
  uint8_t  shortname[18];   
  uint8_t  longname[64];
}__attribute__((packed));

struct ArtDmxPack {
  uint8_t  id[8];
  uint16_t opCode;          
  uint8_t  ip[4];           
  uint16_t port;
  uint8_t  DmxData[512];                 
}__attribute__((packed));

struct ArtNetNode node;
struct ArtPollReplyPack ArtPollReply;
struct ArtDmxPack ArtDmx;

void setup() {
  ArtPollReply.oemH = node.oemH;
  ArtPollReply.oemL = node.oemL;

  memcpy(ArtPollReply.shortname, node.shortname, sizeof(node.shortname));
  memcpy(ArtPollReply.longname, node.longname, sizeof(node.longname));
  memcpy(node.mac, mac, sizeof(mac));
  memcpy(ArtPollReply.mac, node.mac, sizeof(node.mac));

  Ethernet.begin(mac);
  Udp.begin(6454);
}

void loop() {
  switch(Ethernet.maintain()) {
    case 1:
    case 3:
      // rebind / renew failed.
      break;

    case 2:
    case 4:
      // update the node IP address.
      memcpy(node.ip, Ethernet.localIP(), 4);
    case 0:
    default: 
      break;
  }

  Udp.beginPacket(controllerIP, 6454);
  Udp.write((uint8_t *)&ArtPollReply, sizeof(ArtPollReply));
  Udp.endPacket();
}

最佳答案

无法同时更改两个或多个结构的数据。但是,您可以将它们附加到一个特定的结构,这样每当该特定结构的数据或我们可以说基本结构发生变化时,它将影响所有其他结构。总的来说,只需在所有其他结构中调用基础结构即可。 例如,引用下面的代码:

struct o{
    int data=3;
    char name='c';
}one;
struct t{
    int data=one.data;
    char name=one.name;
}two;

现在,当您调用结构二时,它将打印结构一中的数据。

关于c++ - 如何将数据从一个结构链接到另一个结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59768357/

相关文章:

c++ - 在 Visual Studio 2017 的 Linux 项目中使用静态库

c - PIC C编译器RS232传输代码

C、函数格式化中的结构指针

c - malloc 和 free 具有动态变化的结构

c++ - 内置类型的成员是否默认初始化?

c++ - 引用 front 和 pop_front

c++ - x264项目编译

c - 为什么这段C代码不会创建具有用户、组和其他读写权限的文件?

arrays - 如何更改数组中结构的值?

matlab - 如何在 MATLAB 中显示结构数组的选定条目